diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..6c1a252
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,46 @@
+bin/
+.*.jar
+**/xtend-gen
+.DS_Store
+target
+xtend-gen/
+plugin.xml_gen
+/build.runtime.kepler.latest.log.properties
+**/log
+solrserver.conf
+org.eclipse.osbp.runtime.systemextension.license
+org.eclipse.osbp.runtime.systemextension.license.tests.addon
+**git.properties
+
+**/target/
+**/.metadata/
+
+**/emf-gen/**/.gitignore
+**/src-gen/**/.gitignore
+**/git.properties
+**/*.java._trace
+**/*.log
+**/*.log.properties
+
+**/bin/
+**/build/
+*.class
+*.ctrl
+**/Debug/
+.DS_Store
+*.ear
+*.war
+
+**/*.actionbin
+**/*.blipbin
+**/*.chartbin
+**/*.cubebin
+**/*.datatypebin
+**/*.dtobin
+**/*.entitybin
+**/*.servicebin
+**/*.tablebin
+**/*.uibin
+**/*.uisemanticbin
+**/*.xtendbin
+
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.xtext.gridsource.feature/.gitignore b/org.eclipse.osbp.xtext.gridsource.feature/.gitignore
new file mode 100644
index 0000000..e91d5c4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.feature/.gitignore
@@ -0,0 +1,3 @@
+/target/
+/target/
+/target/
diff --git a/org.eclipse.osbp.xtext.gridsource.feature/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.xtext.gridsource.feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.feature/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.xtext.gridsource.feature/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.xtext.gridsource.feature/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.feature/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.xtext.gridsource.feature/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.xtext.gridsource.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.xtext.gridsource.feature/feature.xml b/org.eclipse.osbp.xtext.gridsource.feature/feature.xml
index 213c6cd..a7efc05 100644
--- a/org.eclipse.osbp.xtext.gridsource.feature/feature.xml
+++ b/org.eclipse.osbp.xtext.gridsource.feature/feature.xml
@@ -14,7 +14,8 @@
         id="org.eclipse.osbp.xtext.gridsource.feature"
         label="%featureName"
         version="0.9.0.qualifier"
-        provider-name="%providerName">
+        provider-name="%providerName"
+		plugin="org.eclipse.osbp.xtext.gridsource">
         
     <description>
         %description
@@ -43,6 +44,13 @@
         unpack="false"/>
         
     <plugin
+        id="org.eclipse.osbp.xtext.gridsource.ide"
+        download-size="0"
+        install-size="0"
+        version="0.0.0"
+        unpack="false"/>
+        
+    <plugin
         id="org.eclipse.osbp.xtext.gridsource.ui"
         download-size="0"
         install-size="0"
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/.classpath b/org.eclipse.osbp.xtext.gridsource.ide/.classpath
new file mode 100644
index 0000000..502f456
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/.project b/org.eclipse.osbp.xtext.gridsource.ide/.project
new file mode 100644
index 0000000..ddd9f49
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/.project
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osbp.xtext.gridsource.ide</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.babel.editor.rbeBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.babel.editor.rbeNature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.xtext.gridsource.ide/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osbp.xtext.gridsource.ide/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.xtext.gridsource.ide/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.xtext.gridsource.ide/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/LICENSE.txt b/org.eclipse.osbp.xtext.gridsource.ide/LICENSE.txt
new file mode 100644
index 0000000..ff42ad4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/LICENSE.txt
@@ -0,0 +1,161 @@
+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/org.eclipse.osbp.xtext.gridsource.ide/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.gridsource.ide/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b43f3fd
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.osbp.xtext.gridsource.ide
+Bundle-Vendor: Eclipse OSBP
+Bundle-Version: 0.9.0.qualifier
+Bundle-SymbolicName: org.eclipse.osbp.xtext.gridsource.ide;singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.osbp.xtext.gridsource;bundle-version="[0.9.0,0.10.0)";visibility:=reexport,
+ org.antlr.runtime,
+ org.eclipse.xtext.ide
+Import-Package: org.apache.log4j,
+ org.eclipse.osbp.utils.constants
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osbp.xtext.gridsource.ide,
+ org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr,
+ org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr.internal
+Bundle-ClassPath: src/,src-gen/,xtend-gen/,.
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/about.html b/org.eclipse.osbp.xtext.gridsource.ide/about.html
new file mode 100644
index 0000000..64c0598
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 1, 2016</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/about.ini b/org.eclipse.osbp.xtext.gridsource.ide/about.ini
new file mode 100644
index 0000000..7df671f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/about.ini
@@ -0,0 +1,17 @@
+# about.ini
+# contains information about a feature
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# "%key" are externalized strings defined in about.properties
+# This file does not need to be translated.
+
+# Property "aboutText" contains blurb for "About" dialog (translated)
+aboutText=%featureText
+
+# Property "featureImage" contains path to feature image (32x32)
+featureImage=
+
+# Property "appName" contains name of the application (translated)
+appName=%featureName
+
+# Property "welcomePage" contains path to welcome page (special XML-based format)
+welcomePage=
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/about.mappings b/org.eclipse.osbp.xtext.gridsource.ide/about.mappings
new file mode 100644
index 0000000..4511a0a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/about.mappings
@@ -0,0 +1,6 @@
+# about.mappings
+# contains fill-ins for about.properties
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file does not need to be translated.
+
+0=qualifier
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/about.properties b/org.eclipse.osbp.xtext.gridsource.ide/about.properties
new file mode 100644
index 0000000..047639c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/about.properties
@@ -0,0 +1,26 @@
+#
+# Copyright (c) 2012, 2016 - 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:
+#    Christophe Loetz (Loetz GmbH&Co.KG) - initial API and implementation
+#
+
+# NLS_MESSAGEFORMAT_VAR
+
+featureName=org.eclipse.osbp.xtext.gridsource.ui
+
+################ blurb property ####################################
+featureText=\
+Copyright (c) 2012-2016 - Loetz GmbH&Co.KG \n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+    Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation\n
+################ end of blurb property ####################################
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/build.properties b/org.eclipse.osbp.xtext.gridsource.ide/build.properties
new file mode 100644
index 0000000..555f62e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/build.properties
@@ -0,0 +1,17 @@
+source.. = src/,\
+          src-gen/
+bin.includes = about.properties,\
+               about.mappings,\
+               about.ini,\
+               about.html,\
+               META-INF/,\
+               .,\
+               license.html,\
+               LICENSE.txt,\
+               epl-v10.html,\
+               src/,\
+               src-gen/
+src.includes = about.properties,  about.mappings,  about.ini,  about.html,  license.html,\
+               LICENSE.txt,\
+               epl-v10.html			   
+output = target/classes/
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/epl-v10.html b/org.eclipse.osbp.xtext.gridsource.ide/epl-v10.html
new file mode 100644
index 0000000..b398acc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/epl-v10.html
@@ -0,0 +1,259 @@
+<!--?xml version="1.0" encoding="ISO-8859-1" ?-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head>
+
+<body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>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.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>"Contribution" means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">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.</p>
+
+<p>"Contributor" means any person or entity that distributes
+the Program.</p>
+
+<p>"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.</p>
+
+<p>"Program" means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">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.</p>
+
+<p class="list">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.</p>
+
+<p class="list">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.</p>
+
+<p class="list">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.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">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;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">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.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>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.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>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.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>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.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+<p>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.</p>
+
+
+
+</body></html>
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/license.html b/org.eclipse.osbp.xtext.gridsource.ide/license.html
new file mode 100644
index 0000000..6e579a5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/license.html
@@ -0,0 +1,164 @@
+<!--?xml version="1.0" encoding="ISO-8859-1" ?-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>February 1, 2011</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY "CONTENT").  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse
+ Foundation is provided to you under the terms and conditions of the 
+Eclipse Public License Version 1.0
+   ("EPL").  A copy of the EPL is provided with this Content and is also
+ available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, "Program" will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, 
+documentation and other files maintained in the Eclipse Foundation 
+source code
+   repository ("Repository") in software modules ("Modules") and made 
+available as downloadable archives ("Downloads").</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to 
+facilitate delivering, extending, and upgrading the Content.  Typical 
+modules may include plug-ins ("Plug-ins"), plug-in fragments 
+("Fragments"), and features ("Features").</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&#8482; ARchive) in a directory named "plugins".</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or 
+Fragments and associated material.  Each Feature may be packaged as a 
+sub-directory in a directory named "features".  Within a Feature, files 
+named "feature.xml" may contain a list of the names and version numbers 
+of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features ("Included 
+Features"). Within a Feature, files named "feature.xml" may contain a 
+list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be 
+contained in files named "about.html" ("Abouts"). The terms and 
+conditions governing Features and
+Included Features should be contained in files named "license.html" 
+("Feature Licenses").  Abouts and Feature Licenses may be located in any
+ directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named "src" of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is 
+installed using the Provisioning Technology (as defined below), you must
+ agree to a license ("Feature Update License") during the
+installation process.  If the Feature contains Included Features, the 
+Feature Update License should either provide you with the terms and 
+conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be 
+found in the "license" property of files named "feature.properties" 
+found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the 
+terms and conditions (or references to such terms and conditions) that 
+govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER 
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.
+  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND 
+CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, 
+or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions 
+govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, 
+examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager ("Provisioning Technology") for the purpose of 
+allowing users to install software, documentation, information and/or
+   other materials (collectively "Installable Software"). This 
+capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about 
+packaging Installable Software is available at <a href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   ("Specification").</p>
+
+<p>You may use Provisioning Technology to allow other parties to install
+ Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to
+ be presented to, and accepted by, the users of the Provisioning 
+Technology
+   in accordance with the Specification. By using Provisioning 
+Technology in such a manner and making it available in accordance with 
+the
+   Specification, you further acknowledge your agreement to, and the 
+acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur ("Provisioning Process") in 
+which a user may execute the Provisioning Technology
+       on a machine ("Target Machine") with the intent of installing, 
+extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology 
+may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user 
+the terms and conditions that govern the use of the Installable
+       Software ("Installable Software Agreement") and such Installable 
+Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable 
+Software Agreement must inform the user of the terms and conditions that
+ govern
+       the Installable Software and must solicit acceptance by the end 
+user in the manner prescribed in such Installable Software Agreement. 
+Upon such
+       indication of agreement by the user, the provisioning Technology 
+will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are
+ currently may have restrictions on the import, possession, and use, 
+and/or re-export to
+   another country, of encryption software. BEFORE using any encryption 
+software, please check the country's laws, regulations and policies 
+concerning the import,
+   possession, or use, and re-export of encryption software, to see if 
+this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+
+
+</body></html>
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/pom.xml b/org.eclipse.osbp.xtext.gridsource.ide/pom.xml
new file mode 100644
index 0000000..ee91963
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/pom.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--#======================================================================= -->
+<!--# Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) -->
+<!--# All rights reserved. This program and the accompanying materials -->
+<!--# are made available under the terms of the Eclipse Public License v1.0 -->
+<!--# which accompanies this distribution, and is available at -->
+<!--# http://www.eclipse.org/legal/epl-v10.html -->
+<!--# -->
+<!--# Contributors: -->
+<!--#     Christophe Loetz (Loetz GmbH&Co.KG) - initial API and implementation -->
+<!--#======================================================================= -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.eclipse.osbp.xtext.gridsource</groupId>
+        <artifactId>org.eclipse.osbp.xtext.gridsource.aggregator</artifactId>
+        <version>0.9.0-SNAPSHOT</version>
+        <relativePath>..</relativePath>
+    </parent>
+    <artifactId>org.eclipse.osbp.xtext.gridsource.ide</artifactId>
+    <build>
+        <sourceDirectory>src</sourceDirectory>
+        <plugins>
+        </plugins>
+    </build>
+    <packaging>eclipse-plugin</packaging>
+
+</project>
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/src-gen/META-INF/services/org.eclipse.xtext.ISetup b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/META-INF/services/org.eclipse.xtext.ISetup
new file mode 100644
index 0000000..131784b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/META-INF/services/org.eclipse.xtext.ISetup
@@ -0,0 +1 @@
+org.eclipse.osbp.xtext.gridsource.ide.GridSourceIdeSetup
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/AbstractGridSourceIdeModule.java b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/AbstractGridSourceIdeModule.java
new file mode 100644
index 0000000..3fd9fa7
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/AbstractGridSourceIdeModule.java
@@ -0,0 +1,47 @@
+/*
+ * generated by Xtext 2.11.0
+ */
+package org.eclipse.osbp.xtext.gridsource.ide;
+
+import com.google.inject.Binder;
+import com.google.inject.name.Names;
+import org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr.GridSourceParser;
+import org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr.internal.InternalGridSourceLexer;
+import org.eclipse.xtext.ide.DefaultIdeModule;
+import org.eclipse.xtext.ide.LexerIdeBindings;
+import org.eclipse.xtext.ide.editor.contentassist.FQNPrefixMatcher;
+import org.eclipse.xtext.ide.editor.contentassist.IPrefixMatcher;
+import org.eclipse.xtext.ide.editor.contentassist.IProposalConflictHelper;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.AntlrProposalConflictHelper;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.IContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+
+/**
+ * Manual modifications go to {@link GridSourceIdeModule}.
+ */
+@SuppressWarnings("all")
+public abstract class AbstractGridSourceIdeModule extends DefaultIdeModule {
+
+	// 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(InternalGridSourceLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IContentAssistParser> bindIContentAssistParser() {
+		return GridSourceParser.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IProposalConflictHelper> bindIProposalConflictHelper() {
+		return AntlrProposalConflictHelper.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.exporting.QualifiedNamesFragment2
+	public Class<? extends IPrefixMatcher> bindIPrefixMatcher() {
+		return FQNPrefixMatcher.class;
+	}
+	
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser.java b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser.java
new file mode 100644
index 0000000..3bf0227
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser.java
@@ -0,0 +1,183 @@
+/*
+ * generated by Xtext 2.11.0
+ */
+package org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr;
+
+import com.google.inject.Inject;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr.internal.InternalGridSourceParser;
+import org.eclipse.osbp.xtext.gridsource.services.GridSourceGrammarAccess;
+import org.eclipse.xtext.AbstractElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.AbstractContentAssistParser;
+
+public class GridSourceParser extends AbstractContentAssistParser {
+
+	@Inject
+	private GridSourceGrammarAccess grammarAccess;
+
+	private Map<AbstractElement, String> nameMappings;
+
+	@Override
+	protected InternalGridSourceParser createParser() {
+		InternalGridSourceParser result = new InternalGridSourceParser(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.getPropertyStyleAccess().getAlternatives(), "rule__PropertyStyle__Alternatives");
+					put(grammarAccess.getStyleConfigAccess().getAlternatives(), "rule__StyleConfig__Alternatives");
+					put(grammarAccess.getLIntAccess().getAlternatives_0(), "rule__LInt__Alternatives_0");
+					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.getStyleCompareAccess().getAlternatives(), "rule__StyleCompare__Alternatives");
+					put(grammarAccess.getSourceAccess().getGroup(), "rule__Source__Group__0");
+					put(grammarAccess.getInputAccess().getGroup(), "rule__Input__Group__0");
+					put(grammarAccess.getInputAccess().getGroup_4(), "rule__Input__Group_4__0");
+					put(grammarAccess.getEQFilterAccess().getGroup(), "rule__EQFilter__Group__0");
+					put(grammarAccess.getPropertyAccess().getGroup(), "rule__Property__Group__0");
+					put(grammarAccess.getNestedFieldAccess().getGroup(), "rule__NestedField__Group__0");
+					put(grammarAccess.getNestedPathAccess().getGroup(), "rule__NestedPath__Group__0");
+					put(grammarAccess.getPropertyButtonStyleAccess().getGroup(), "rule__PropertyButtonStyle__Group__0");
+					put(grammarAccess.getPropertyHtmlStyleAccess().getGroup(), "rule__PropertyHtmlStyle__Group__0");
+					put(grammarAccess.getPropertyBooleanStyleAccess().getGroup(), "rule__PropertyBooleanStyle__Group__0");
+					put(grammarAccess.getPropertyDateStyleAccess().getGroup(), "rule__PropertyDateStyle__Group__0");
+					put(grammarAccess.getPropertyNumberStyleAccess().getGroup(), "rule__PropertyNumberStyle__Group__0");
+					put(grammarAccess.getPropertyProgressbarStyleAccess().getGroup(), "rule__PropertyProgressbarStyle__Group__0");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getGroup(), "rule__GridPropIndicatorStyle__Group__0");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getGroup(), "rule__PropertyQuantityStyle__Group__0");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getGroup_6(), "rule__PropertyQuantityStyle__Group_6__0");
+					put(grammarAccess.getPropertyPriceStyleAccess().getGroup(), "rule__PropertyPriceStyle__Group__0");
+					put(grammarAccess.getPropertyPriceStyleAccess().getGroup_6(), "rule__PropertyPriceStyle__Group_6__0");
+					put(grammarAccess.getPropertyTextStyleAccess().getGroup(), "rule__PropertyTextStyle__Group__0");
+					put(grammarAccess.getPropertyImageStyleAccess().getGroup(), "rule__PropertyImageStyle__Group__0");
+					put(grammarAccess.getPropertyImageStyleAccess().getGroup_2(), "rule__PropertyImageStyle__Group_2__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup(), "rule__QualifiedName__Group__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup_1(), "rule__QualifiedName__Group_1__0");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getGroup(), "rule__NumericToResourceStyleConfig__Group__0");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getGroup(), "rule__StringToResourceStyleConfig__Group__0");
+					put(grammarAccess.getLIntAccess().getGroup(), "rule__LInt__Group__0");
+					put(grammarAccess.getLDoubleAccess().getGroup(), "rule__LDouble__Group__0");
+					put(grammarAccess.getLDoubleAccess().getGroup_1(), "rule__LDouble__Group_1__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.getSourceAccess().getIdAssignment_1(), "rule__Source__IdAssignment_1");
+					put(grammarAccess.getSourceAccess().getRootTypeAssignment_3(), "rule__Source__RootTypeAssignment_3");
+					put(grammarAccess.getSourceAccess().getInputsAssignment_7(), "rule__Source__InputsAssignment_7");
+					put(grammarAccess.getSourceAccess().getPropertiesAssignment_9(), "rule__Source__PropertiesAssignment_9");
+					put(grammarAccess.getInputAccess().getInputTypeAssignment_1(), "rule__Input__InputTypeAssignment_1");
+					put(grammarAccess.getInputAccess().getFiltersAssignment_3(), "rule__Input__FiltersAssignment_3");
+					put(grammarAccess.getInputAccess().getFiltersAssignment_4_1(), "rule__Input__FiltersAssignment_4_1");
+					put(grammarAccess.getEQFilterAccess().getRootTypePropertyPathAssignment_2(), "rule__EQFilter__RootTypePropertyPathAssignment_2");
+					put(grammarAccess.getEQFilterAccess().getInputTypePropertyPathAssignment_5(), "rule__EQFilter__InputTypePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyAccess().getPathAssignment_1(), "rule__Property__PathAssignment_1");
+					put(grammarAccess.getPropertyAccess().getStyleAssignment_3(), "rule__Property__StyleAssignment_3");
+					put(grammarAccess.getNestedFieldAccess().getFieldAssignment_1(), "rule__NestedField__FieldAssignment_1");
+					put(grammarAccess.getNestedFieldAccess().getPathAssignment_2(), "rule__NestedField__PathAssignment_2");
+					put(grammarAccess.getNestedPathAccess().getFieldAssignment_2(), "rule__NestedPath__FieldAssignment_2");
+					put(grammarAccess.getNestedPathAccess().getPathAssignment_3(), "rule__NestedPath__PathAssignment_3");
+					put(grammarAccess.getPropertyButtonStyleAccess().getEventTopicAssignment_3(), "rule__PropertyButtonStyle__EventTopicAssignment_3");
+					put(grammarAccess.getPropertyDateStyleAccess().getDateFormatAssignment_3(), "rule__PropertyDateStyle__DateFormatAssignment_3");
+					put(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatAssignment_3(), "rule__PropertyNumberStyle__NumberFormatAssignment_3");
+					put(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueAssignment_3(), "rule__PropertyProgressbarStyle__MaxValueAssignment_3");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsAssignment_3(), "rule__GridPropIndicatorStyle__GreenStartsAssignment_3");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsAssignment_5(), "rule__GridPropIndicatorStyle__RedEndsAssignment_5");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternAssignment_2(), "rule__PropertyQuantityStyle__HtmlPatternAssignment_2");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathAssignment_5(), "rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatAssignment_6_2(), "rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathAssignment_9(), "rule__PropertyQuantityStyle__UomPropertyPathAssignment_9");
+					put(grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternAssignment_2(), "rule__PropertyPriceStyle__HtmlPatternAssignment_2");
+					put(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathAssignment_5(), "rule__PropertyPriceStyle__ValuePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatAssignment_6_2(), "rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2");
+					put(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathAssignment_9(), "rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9");
+					put(grammarAccess.getPropertyImageStyleAccess().getEventTopicAssignment_2_1(), "rule__PropertyImageStyle__EventTopicAssignment_2_1");
+					put(grammarAccess.getPropertyImageStyleAccess().getConfigsAssignment_4(), "rule__PropertyImageStyle__ConfigsAssignment_4");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareAssignment_1(), "rule__NumericToResourceStyleConfig__CompareAssignment_1");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getValueAssignment_2(), "rule__NumericToResourceStyleConfig__ValueAssignment_2");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathAssignment_4(), "rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getCompareAssignment_1(), "rule__StringToResourceStyleConfig__CompareAssignment_1");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getValueAssignment_2(), "rule__StringToResourceStyleConfig__ValueAssignment_2");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathAssignment_4(), "rule__StringToResourceStyleConfig__ResourceThemePathAssignment_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");
+				}
+			};
+		}
+		return nameMappings.get(element);
+	}
+			
+	@Override
+	protected String[] getInitialHiddenTokens() {
+		return new String[] { "RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT" };
+	}
+
+	public GridSourceGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+
+	public void setGrammarAccess(GridSourceGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser_BACKUP_39908.java b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser_BACKUP_39908.java
new file mode 100644
index 0000000..986526d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser_BACKUP_39908.java
@@ -0,0 +1,210 @@
+<<<<<<< HEAD:org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/GridSourceParser.java
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ */
+package org.eclipse.osbp.xtext.gridsource.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;
+=======
+/*
+ * generated by Xtext 2.11.0
+ */
+package org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr;
+>>>>>>> origin/development:org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser.java
+
+import com.google.inject.Inject;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr.internal.InternalGridSourceParser;
+import org.eclipse.osbp.xtext.gridsource.services.GridSourceGrammarAccess;
+import org.eclipse.xtext.AbstractElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.AbstractContentAssistParser;
+
+public class GridSourceParser extends AbstractContentAssistParser {
+
+	@Inject
+	private GridSourceGrammarAccess grammarAccess;
+
+	private Map<AbstractElement, String> nameMappings;
+
+	@Override
+	protected InternalGridSourceParser createParser() {
+		InternalGridSourceParser result = new InternalGridSourceParser(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.getPropertyStyleAccess().getAlternatives(), "rule__PropertyStyle__Alternatives");
+					put(grammarAccess.getStyleConfigAccess().getAlternatives(), "rule__StyleConfig__Alternatives");
+					put(grammarAccess.getLIntAccess().getAlternatives_0(), "rule__LInt__Alternatives_0");
+					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.getStyleCompareAccess().getAlternatives(), "rule__StyleCompare__Alternatives");
+					put(grammarAccess.getSourceAccess().getGroup(), "rule__Source__Group__0");
+					put(grammarAccess.getInputAccess().getGroup(), "rule__Input__Group__0");
+					put(grammarAccess.getInputAccess().getGroup_4(), "rule__Input__Group_4__0");
+					put(grammarAccess.getEQFilterAccess().getGroup(), "rule__EQFilter__Group__0");
+					put(grammarAccess.getPropertyAccess().getGroup(), "rule__Property__Group__0");
+					put(grammarAccess.getNestedFieldAccess().getGroup(), "rule__NestedField__Group__0");
+					put(grammarAccess.getNestedPathAccess().getGroup(), "rule__NestedPath__Group__0");
+					put(grammarAccess.getPropertyButtonStyleAccess().getGroup(), "rule__PropertyButtonStyle__Group__0");
+					put(grammarAccess.getPropertyHtmlStyleAccess().getGroup(), "rule__PropertyHtmlStyle__Group__0");
+					put(grammarAccess.getPropertyBooleanStyleAccess().getGroup(), "rule__PropertyBooleanStyle__Group__0");
+					put(grammarAccess.getPropertyDateStyleAccess().getGroup(), "rule__PropertyDateStyle__Group__0");
+					put(grammarAccess.getPropertyNumberStyleAccess().getGroup(), "rule__PropertyNumberStyle__Group__0");
+					put(grammarAccess.getPropertyProgressbarStyleAccess().getGroup(), "rule__PropertyProgressbarStyle__Group__0");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getGroup(), "rule__GridPropIndicatorStyle__Group__0");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getGroup(), "rule__PropertyQuantityStyle__Group__0");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getGroup_6(), "rule__PropertyQuantityStyle__Group_6__0");
+					put(grammarAccess.getPropertyPriceStyleAccess().getGroup(), "rule__PropertyPriceStyle__Group__0");
+					put(grammarAccess.getPropertyPriceStyleAccess().getGroup_6(), "rule__PropertyPriceStyle__Group_6__0");
+					put(grammarAccess.getPropertyTextStyleAccess().getGroup(), "rule__PropertyTextStyle__Group__0");
+					put(grammarAccess.getPropertyImageStyleAccess().getGroup(), "rule__PropertyImageStyle__Group__0");
+					put(grammarAccess.getPropertyImageStyleAccess().getGroup_2(), "rule__PropertyImageStyle__Group_2__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup(), "rule__QualifiedName__Group__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup_1(), "rule__QualifiedName__Group_1__0");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getGroup(), "rule__NumericToResourceStyleConfig__Group__0");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getGroup(), "rule__StringToResourceStyleConfig__Group__0");
+					put(grammarAccess.getLIntAccess().getGroup(), "rule__LInt__Group__0");
+					put(grammarAccess.getLDoubleAccess().getGroup(), "rule__LDouble__Group__0");
+					put(grammarAccess.getLDoubleAccess().getGroup_1(), "rule__LDouble__Group_1__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.getSourceAccess().getIdAssignment_1(), "rule__Source__IdAssignment_1");
+					put(grammarAccess.getSourceAccess().getRootTypeAssignment_3(), "rule__Source__RootTypeAssignment_3");
+					put(grammarAccess.getSourceAccess().getInputsAssignment_7(), "rule__Source__InputsAssignment_7");
+					put(grammarAccess.getSourceAccess().getPropertiesAssignment_9(), "rule__Source__PropertiesAssignment_9");
+					put(grammarAccess.getInputAccess().getInputTypeAssignment_1(), "rule__Input__InputTypeAssignment_1");
+					put(grammarAccess.getInputAccess().getFiltersAssignment_3(), "rule__Input__FiltersAssignment_3");
+					put(grammarAccess.getInputAccess().getFiltersAssignment_4_1(), "rule__Input__FiltersAssignment_4_1");
+					put(grammarAccess.getEQFilterAccess().getRootTypePropertyPathAssignment_2(), "rule__EQFilter__RootTypePropertyPathAssignment_2");
+					put(grammarAccess.getEQFilterAccess().getInputTypePropertyPathAssignment_5(), "rule__EQFilter__InputTypePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyAccess().getPathAssignment_1(), "rule__Property__PathAssignment_1");
+					put(grammarAccess.getPropertyAccess().getStyleAssignment_3(), "rule__Property__StyleAssignment_3");
+					put(grammarAccess.getNestedFieldAccess().getFieldAssignment_1(), "rule__NestedField__FieldAssignment_1");
+					put(grammarAccess.getNestedFieldAccess().getPathAssignment_2(), "rule__NestedField__PathAssignment_2");
+					put(grammarAccess.getNestedPathAccess().getFieldAssignment_2(), "rule__NestedPath__FieldAssignment_2");
+					put(grammarAccess.getNestedPathAccess().getPathAssignment_3(), "rule__NestedPath__PathAssignment_3");
+					put(grammarAccess.getPropertyButtonStyleAccess().getEventTopicAssignment_3(), "rule__PropertyButtonStyle__EventTopicAssignment_3");
+					put(grammarAccess.getPropertyDateStyleAccess().getDateFormatAssignment_3(), "rule__PropertyDateStyle__DateFormatAssignment_3");
+					put(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatAssignment_3(), "rule__PropertyNumberStyle__NumberFormatAssignment_3");
+					put(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueAssignment_3(), "rule__PropertyProgressbarStyle__MaxValueAssignment_3");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsAssignment_3(), "rule__GridPropIndicatorStyle__GreenStartsAssignment_3");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsAssignment_5(), "rule__GridPropIndicatorStyle__RedEndsAssignment_5");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternAssignment_2(), "rule__PropertyQuantityStyle__HtmlPatternAssignment_2");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathAssignment_5(), "rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatAssignment_6_2(), "rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathAssignment_9(), "rule__PropertyQuantityStyle__UomPropertyPathAssignment_9");
+					put(grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternAssignment_2(), "rule__PropertyPriceStyle__HtmlPatternAssignment_2");
+					put(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathAssignment_5(), "rule__PropertyPriceStyle__ValuePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatAssignment_6_2(), "rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2");
+					put(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathAssignment_9(), "rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9");
+					put(grammarAccess.getPropertyImageStyleAccess().getEventTopicAssignment_2_1(), "rule__PropertyImageStyle__EventTopicAssignment_2_1");
+					put(grammarAccess.getPropertyImageStyleAccess().getConfigsAssignment_4(), "rule__PropertyImageStyle__ConfigsAssignment_4");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareAssignment_1(), "rule__NumericToResourceStyleConfig__CompareAssignment_1");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getValueAssignment_2(), "rule__NumericToResourceStyleConfig__ValueAssignment_2");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathAssignment_4(), "rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getCompareAssignment_1(), "rule__StringToResourceStyleConfig__CompareAssignment_1");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getValueAssignment_2(), "rule__StringToResourceStyleConfig__ValueAssignment_2");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathAssignment_4(), "rule__StringToResourceStyleConfig__ResourceThemePathAssignment_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");
+				}
+			};
+		}
+		return nameMappings.get(element);
+	}
+			
+	@Override
+	protected String[] getInitialHiddenTokens() {
+		return new String[] { "RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT" };
+	}
+
+	public GridSourceGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+
+	public void setGrammarAccess(GridSourceGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser_BASE_39908.java b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser_BASE_39908.java
new file mode 100644
index 0000000..78d2bef
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser_BASE_39908.java
@@ -0,0 +1,200 @@
+/*
+* generated by Xtext
+*/
+package org.eclipse.osbp.xtext.gridsource.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.xtext.gridsource.services.GridSourceGrammarAccess;
+
+public class GridSourceParser extends AbstractContentAssistParser {
+	
+	@Inject
+	private GridSourceGrammarAccess grammarAccess;
+	
+	private Map<AbstractElement, String> nameMappings;
+	
+	@Override
+	protected org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal.InternalGridSourceParser createParser() {
+		org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal.InternalGridSourceParser result = new org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal.InternalGridSourceParser(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.getPropertyStyleAccess().getAlternatives(), "rule__PropertyStyle__Alternatives");
+					put(grammarAccess.getStyleConfigAccess().getAlternatives(), "rule__StyleConfig__Alternatives");
+					put(grammarAccess.getLIntAccess().getAlternatives_0(), "rule__LInt__Alternatives_0");
+					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.getStyleCompareAccess().getAlternatives(), "rule__StyleCompare__Alternatives");
+					put(grammarAccess.getSourceAccess().getGroup(), "rule__Source__Group__0");
+					put(grammarAccess.getInputAccess().getGroup(), "rule__Input__Group__0");
+					put(grammarAccess.getInputAccess().getGroup_4(), "rule__Input__Group_4__0");
+					put(grammarAccess.getEQFilterAccess().getGroup(), "rule__EQFilter__Group__0");
+					put(grammarAccess.getPropertyAccess().getGroup(), "rule__Property__Group__0");
+					put(grammarAccess.getNestedFieldAccess().getGroup(), "rule__NestedField__Group__0");
+					put(grammarAccess.getNestedPathAccess().getGroup(), "rule__NestedPath__Group__0");
+					put(grammarAccess.getPropertyButtonStyleAccess().getGroup(), "rule__PropertyButtonStyle__Group__0");
+					put(grammarAccess.getPropertyHtmlStyleAccess().getGroup(), "rule__PropertyHtmlStyle__Group__0");
+					put(grammarAccess.getPropertyBooleanStyleAccess().getGroup(), "rule__PropertyBooleanStyle__Group__0");
+					put(grammarAccess.getPropertyDateStyleAccess().getGroup(), "rule__PropertyDateStyle__Group__0");
+					put(grammarAccess.getPropertyNumberStyleAccess().getGroup(), "rule__PropertyNumberStyle__Group__0");
+					put(grammarAccess.getPropertyProgressbarStyleAccess().getGroup(), "rule__PropertyProgressbarStyle__Group__0");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getGroup(), "rule__GridPropIndicatorStyle__Group__0");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getGroup(), "rule__PropertyQuantityStyle__Group__0");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getGroup_6(), "rule__PropertyQuantityStyle__Group_6__0");
+					put(grammarAccess.getPropertyPriceStyleAccess().getGroup(), "rule__PropertyPriceStyle__Group__0");
+					put(grammarAccess.getPropertyPriceStyleAccess().getGroup_6(), "rule__PropertyPriceStyle__Group_6__0");
+					put(grammarAccess.getPropertyTextStyleAccess().getGroup(), "rule__PropertyTextStyle__Group__0");
+					put(grammarAccess.getPropertyImageStyleAccess().getGroup(), "rule__PropertyImageStyle__Group__0");
+					put(grammarAccess.getPropertyImageStyleAccess().getGroup_2(), "rule__PropertyImageStyle__Group_2__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup(), "rule__QualifiedName__Group__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup_1(), "rule__QualifiedName__Group_1__0");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getGroup(), "rule__NumericToResourceStyleConfig__Group__0");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getGroup(), "rule__StringToResourceStyleConfig__Group__0");
+					put(grammarAccess.getLIntAccess().getGroup(), "rule__LInt__Group__0");
+					put(grammarAccess.getLDoubleAccess().getGroup(), "rule__LDouble__Group__0");
+					put(grammarAccess.getLDoubleAccess().getGroup_1(), "rule__LDouble__Group_1__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.getSourceAccess().getIdAssignment_1(), "rule__Source__IdAssignment_1");
+					put(grammarAccess.getSourceAccess().getRootTypeAssignment_3(), "rule__Source__RootTypeAssignment_3");
+					put(grammarAccess.getSourceAccess().getInputsAssignment_7(), "rule__Source__InputsAssignment_7");
+					put(grammarAccess.getSourceAccess().getPropertiesAssignment_9(), "rule__Source__PropertiesAssignment_9");
+					put(grammarAccess.getInputAccess().getInputTypeAssignment_1(), "rule__Input__InputTypeAssignment_1");
+					put(grammarAccess.getInputAccess().getFiltersAssignment_3(), "rule__Input__FiltersAssignment_3");
+					put(grammarAccess.getInputAccess().getFiltersAssignment_4_1(), "rule__Input__FiltersAssignment_4_1");
+					put(grammarAccess.getEQFilterAccess().getRootTypePropertyPathAssignment_2(), "rule__EQFilter__RootTypePropertyPathAssignment_2");
+					put(grammarAccess.getEQFilterAccess().getInputTypePropertyPathAssignment_5(), "rule__EQFilter__InputTypePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyAccess().getPathAssignment_1(), "rule__Property__PathAssignment_1");
+					put(grammarAccess.getPropertyAccess().getStyleAssignment_3(), "rule__Property__StyleAssignment_3");
+					put(grammarAccess.getNestedFieldAccess().getFieldAssignment_1(), "rule__NestedField__FieldAssignment_1");
+					put(grammarAccess.getNestedFieldAccess().getPathAssignment_2(), "rule__NestedField__PathAssignment_2");
+					put(grammarAccess.getNestedPathAccess().getFieldAssignment_2(), "rule__NestedPath__FieldAssignment_2");
+					put(grammarAccess.getNestedPathAccess().getPathAssignment_3(), "rule__NestedPath__PathAssignment_3");
+					put(grammarAccess.getPropertyButtonStyleAccess().getEventTopicAssignment_3(), "rule__PropertyButtonStyle__EventTopicAssignment_3");
+					put(grammarAccess.getPropertyDateStyleAccess().getDateFormatAssignment_3(), "rule__PropertyDateStyle__DateFormatAssignment_3");
+					put(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatAssignment_3(), "rule__PropertyNumberStyle__NumberFormatAssignment_3");
+					put(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueAssignment_3(), "rule__PropertyProgressbarStyle__MaxValueAssignment_3");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsAssignment_3(), "rule__GridPropIndicatorStyle__GreenStartsAssignment_3");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsAssignment_5(), "rule__GridPropIndicatorStyle__RedEndsAssignment_5");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternAssignment_2(), "rule__PropertyQuantityStyle__HtmlPatternAssignment_2");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathAssignment_5(), "rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatAssignment_6_2(), "rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathAssignment_9(), "rule__PropertyQuantityStyle__UomPropertyPathAssignment_9");
+					put(grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternAssignment_2(), "rule__PropertyPriceStyle__HtmlPatternAssignment_2");
+					put(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathAssignment_5(), "rule__PropertyPriceStyle__ValuePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatAssignment_6_2(), "rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2");
+					put(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathAssignment_9(), "rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9");
+					put(grammarAccess.getPropertyImageStyleAccess().getEventTopicAssignment_2_1(), "rule__PropertyImageStyle__EventTopicAssignment_2_1");
+					put(grammarAccess.getPropertyImageStyleAccess().getConfigsAssignment_4(), "rule__PropertyImageStyle__ConfigsAssignment_4");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareAssignment_1(), "rule__NumericToResourceStyleConfig__CompareAssignment_1");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getValueAssignment_2(), "rule__NumericToResourceStyleConfig__ValueAssignment_2");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathAssignment_4(), "rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getCompareAssignment_1(), "rule__StringToResourceStyleConfig__CompareAssignment_1");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getValueAssignment_2(), "rule__StringToResourceStyleConfig__ValueAssignment_2");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathAssignment_4(), "rule__StringToResourceStyleConfig__ResourceThemePathAssignment_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");
+				}
+			};
+		}
+		return nameMappings.get(element);
+	}
+	
+	@Override
+	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+		try {
+			org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal.InternalGridSourceParser typedParser = (org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal.InternalGridSourceParser) parser;
+			typedParser.entryRuleSource();
+			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 GridSourceGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+	
+	public void setGrammarAccess(GridSourceGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser_LOCAL_39908.java b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser_LOCAL_39908.java
new file mode 100644
index 0000000..518f2e9
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser_LOCAL_39908.java
@@ -0,0 +1,210 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ */
+package org.eclipse.osbp.xtext.gridsource.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.xtext.gridsource.services.GridSourceGrammarAccess;
+
+public class GridSourceParser extends AbstractContentAssistParser {
+	
+	@Inject
+	private GridSourceGrammarAccess grammarAccess;
+	
+	private Map<AbstractElement, String> nameMappings;
+	
+	@Override
+	protected org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal.InternalGridSourceParser createParser() {
+		org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal.InternalGridSourceParser result = new org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal.InternalGridSourceParser(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.getPropertyStyleAccess().getAlternatives(), "rule__PropertyStyle__Alternatives");
+					put(grammarAccess.getStyleConfigAccess().getAlternatives(), "rule__StyleConfig__Alternatives");
+					put(grammarAccess.getLIntAccess().getAlternatives_0(), "rule__LInt__Alternatives_0");
+					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.getStyleCompareAccess().getAlternatives(), "rule__StyleCompare__Alternatives");
+					put(grammarAccess.getSourceAccess().getGroup(), "rule__Source__Group__0");
+					put(grammarAccess.getInputAccess().getGroup(), "rule__Input__Group__0");
+					put(grammarAccess.getInputAccess().getGroup_4(), "rule__Input__Group_4__0");
+					put(grammarAccess.getEQFilterAccess().getGroup(), "rule__EQFilter__Group__0");
+					put(grammarAccess.getPropertyAccess().getGroup(), "rule__Property__Group__0");
+					put(grammarAccess.getNestedFieldAccess().getGroup(), "rule__NestedField__Group__0");
+					put(grammarAccess.getNestedPathAccess().getGroup(), "rule__NestedPath__Group__0");
+					put(grammarAccess.getPropertyButtonStyleAccess().getGroup(), "rule__PropertyButtonStyle__Group__0");
+					put(grammarAccess.getPropertyHtmlStyleAccess().getGroup(), "rule__PropertyHtmlStyle__Group__0");
+					put(grammarAccess.getPropertyBooleanStyleAccess().getGroup(), "rule__PropertyBooleanStyle__Group__0");
+					put(grammarAccess.getPropertyDateStyleAccess().getGroup(), "rule__PropertyDateStyle__Group__0");
+					put(grammarAccess.getPropertyNumberStyleAccess().getGroup(), "rule__PropertyNumberStyle__Group__0");
+					put(grammarAccess.getPropertyProgressbarStyleAccess().getGroup(), "rule__PropertyProgressbarStyle__Group__0");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getGroup(), "rule__GridPropIndicatorStyle__Group__0");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getGroup(), "rule__PropertyQuantityStyle__Group__0");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getGroup_6(), "rule__PropertyQuantityStyle__Group_6__0");
+					put(grammarAccess.getPropertyPriceStyleAccess().getGroup(), "rule__PropertyPriceStyle__Group__0");
+					put(grammarAccess.getPropertyPriceStyleAccess().getGroup_6(), "rule__PropertyPriceStyle__Group_6__0");
+					put(grammarAccess.getPropertyTextStyleAccess().getGroup(), "rule__PropertyTextStyle__Group__0");
+					put(grammarAccess.getPropertyImageStyleAccess().getGroup(), "rule__PropertyImageStyle__Group__0");
+					put(grammarAccess.getPropertyImageStyleAccess().getGroup_2(), "rule__PropertyImageStyle__Group_2__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup(), "rule__QualifiedName__Group__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup_1(), "rule__QualifiedName__Group_1__0");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getGroup(), "rule__NumericToResourceStyleConfig__Group__0");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getGroup(), "rule__StringToResourceStyleConfig__Group__0");
+					put(grammarAccess.getLIntAccess().getGroup(), "rule__LInt__Group__0");
+					put(grammarAccess.getLDoubleAccess().getGroup(), "rule__LDouble__Group__0");
+					put(grammarAccess.getLDoubleAccess().getGroup_1(), "rule__LDouble__Group_1__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.getSourceAccess().getIdAssignment_1(), "rule__Source__IdAssignment_1");
+					put(grammarAccess.getSourceAccess().getRootTypeAssignment_3(), "rule__Source__RootTypeAssignment_3");
+					put(grammarAccess.getSourceAccess().getInputsAssignment_7(), "rule__Source__InputsAssignment_7");
+					put(grammarAccess.getSourceAccess().getPropertiesAssignment_9(), "rule__Source__PropertiesAssignment_9");
+					put(grammarAccess.getInputAccess().getInputTypeAssignment_1(), "rule__Input__InputTypeAssignment_1");
+					put(grammarAccess.getInputAccess().getFiltersAssignment_3(), "rule__Input__FiltersAssignment_3");
+					put(grammarAccess.getInputAccess().getFiltersAssignment_4_1(), "rule__Input__FiltersAssignment_4_1");
+					put(grammarAccess.getEQFilterAccess().getRootTypePropertyPathAssignment_2(), "rule__EQFilter__RootTypePropertyPathAssignment_2");
+					put(grammarAccess.getEQFilterAccess().getInputTypePropertyPathAssignment_5(), "rule__EQFilter__InputTypePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyAccess().getPathAssignment_1(), "rule__Property__PathAssignment_1");
+					put(grammarAccess.getPropertyAccess().getStyleAssignment_3(), "rule__Property__StyleAssignment_3");
+					put(grammarAccess.getNestedFieldAccess().getFieldAssignment_1(), "rule__NestedField__FieldAssignment_1");
+					put(grammarAccess.getNestedFieldAccess().getPathAssignment_2(), "rule__NestedField__PathAssignment_2");
+					put(grammarAccess.getNestedPathAccess().getFieldAssignment_2(), "rule__NestedPath__FieldAssignment_2");
+					put(grammarAccess.getNestedPathAccess().getPathAssignment_3(), "rule__NestedPath__PathAssignment_3");
+					put(grammarAccess.getPropertyButtonStyleAccess().getEventTopicAssignment_3(), "rule__PropertyButtonStyle__EventTopicAssignment_3");
+					put(grammarAccess.getPropertyDateStyleAccess().getDateFormatAssignment_3(), "rule__PropertyDateStyle__DateFormatAssignment_3");
+					put(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatAssignment_3(), "rule__PropertyNumberStyle__NumberFormatAssignment_3");
+					put(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueAssignment_3(), "rule__PropertyProgressbarStyle__MaxValueAssignment_3");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsAssignment_3(), "rule__GridPropIndicatorStyle__GreenStartsAssignment_3");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsAssignment_5(), "rule__GridPropIndicatorStyle__RedEndsAssignment_5");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternAssignment_2(), "rule__PropertyQuantityStyle__HtmlPatternAssignment_2");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathAssignment_5(), "rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatAssignment_6_2(), "rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathAssignment_9(), "rule__PropertyQuantityStyle__UomPropertyPathAssignment_9");
+					put(grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternAssignment_2(), "rule__PropertyPriceStyle__HtmlPatternAssignment_2");
+					put(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathAssignment_5(), "rule__PropertyPriceStyle__ValuePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatAssignment_6_2(), "rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2");
+					put(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathAssignment_9(), "rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9");
+					put(grammarAccess.getPropertyImageStyleAccess().getEventTopicAssignment_2_1(), "rule__PropertyImageStyle__EventTopicAssignment_2_1");
+					put(grammarAccess.getPropertyImageStyleAccess().getConfigsAssignment_4(), "rule__PropertyImageStyle__ConfigsAssignment_4");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareAssignment_1(), "rule__NumericToResourceStyleConfig__CompareAssignment_1");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getValueAssignment_2(), "rule__NumericToResourceStyleConfig__ValueAssignment_2");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathAssignment_4(), "rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getCompareAssignment_1(), "rule__StringToResourceStyleConfig__CompareAssignment_1");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getValueAssignment_2(), "rule__StringToResourceStyleConfig__ValueAssignment_2");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathAssignment_4(), "rule__StringToResourceStyleConfig__ResourceThemePathAssignment_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");
+				}
+			};
+		}
+		return nameMappings.get(element);
+	}
+	
+	@Override
+	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+		try {
+			org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal.InternalGridSourceParser typedParser = (org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal.InternalGridSourceParser) parser;
+			typedParser.entryRuleSource();
+			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 GridSourceGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+	
+	public void setGrammarAccess(GridSourceGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser_REMOTE_39908.java b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser_REMOTE_39908.java
new file mode 100644
index 0000000..3bf0227
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/GridSourceParser_REMOTE_39908.java
@@ -0,0 +1,183 @@
+/*
+ * generated by Xtext 2.11.0
+ */
+package org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr;
+
+import com.google.inject.Inject;
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr.internal.InternalGridSourceParser;
+import org.eclipse.osbp.xtext.gridsource.services.GridSourceGrammarAccess;
+import org.eclipse.xtext.AbstractElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.AbstractContentAssistParser;
+
+public class GridSourceParser extends AbstractContentAssistParser {
+
+	@Inject
+	private GridSourceGrammarAccess grammarAccess;
+
+	private Map<AbstractElement, String> nameMappings;
+
+	@Override
+	protected InternalGridSourceParser createParser() {
+		InternalGridSourceParser result = new InternalGridSourceParser(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.getPropertyStyleAccess().getAlternatives(), "rule__PropertyStyle__Alternatives");
+					put(grammarAccess.getStyleConfigAccess().getAlternatives(), "rule__StyleConfig__Alternatives");
+					put(grammarAccess.getLIntAccess().getAlternatives_0(), "rule__LInt__Alternatives_0");
+					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.getStyleCompareAccess().getAlternatives(), "rule__StyleCompare__Alternatives");
+					put(grammarAccess.getSourceAccess().getGroup(), "rule__Source__Group__0");
+					put(grammarAccess.getInputAccess().getGroup(), "rule__Input__Group__0");
+					put(grammarAccess.getInputAccess().getGroup_4(), "rule__Input__Group_4__0");
+					put(grammarAccess.getEQFilterAccess().getGroup(), "rule__EQFilter__Group__0");
+					put(grammarAccess.getPropertyAccess().getGroup(), "rule__Property__Group__0");
+					put(grammarAccess.getNestedFieldAccess().getGroup(), "rule__NestedField__Group__0");
+					put(grammarAccess.getNestedPathAccess().getGroup(), "rule__NestedPath__Group__0");
+					put(grammarAccess.getPropertyButtonStyleAccess().getGroup(), "rule__PropertyButtonStyle__Group__0");
+					put(grammarAccess.getPropertyHtmlStyleAccess().getGroup(), "rule__PropertyHtmlStyle__Group__0");
+					put(grammarAccess.getPropertyBooleanStyleAccess().getGroup(), "rule__PropertyBooleanStyle__Group__0");
+					put(grammarAccess.getPropertyDateStyleAccess().getGroup(), "rule__PropertyDateStyle__Group__0");
+					put(grammarAccess.getPropertyNumberStyleAccess().getGroup(), "rule__PropertyNumberStyle__Group__0");
+					put(grammarAccess.getPropertyProgressbarStyleAccess().getGroup(), "rule__PropertyProgressbarStyle__Group__0");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getGroup(), "rule__GridPropIndicatorStyle__Group__0");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getGroup(), "rule__PropertyQuantityStyle__Group__0");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getGroup_6(), "rule__PropertyQuantityStyle__Group_6__0");
+					put(grammarAccess.getPropertyPriceStyleAccess().getGroup(), "rule__PropertyPriceStyle__Group__0");
+					put(grammarAccess.getPropertyPriceStyleAccess().getGroup_6(), "rule__PropertyPriceStyle__Group_6__0");
+					put(grammarAccess.getPropertyTextStyleAccess().getGroup(), "rule__PropertyTextStyle__Group__0");
+					put(grammarAccess.getPropertyImageStyleAccess().getGroup(), "rule__PropertyImageStyle__Group__0");
+					put(grammarAccess.getPropertyImageStyleAccess().getGroup_2(), "rule__PropertyImageStyle__Group_2__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup(), "rule__QualifiedName__Group__0");
+					put(grammarAccess.getQualifiedNameAccess().getGroup_1(), "rule__QualifiedName__Group_1__0");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getGroup(), "rule__NumericToResourceStyleConfig__Group__0");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getGroup(), "rule__StringToResourceStyleConfig__Group__0");
+					put(grammarAccess.getLIntAccess().getGroup(), "rule__LInt__Group__0");
+					put(grammarAccess.getLDoubleAccess().getGroup(), "rule__LDouble__Group__0");
+					put(grammarAccess.getLDoubleAccess().getGroup_1(), "rule__LDouble__Group_1__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.getSourceAccess().getIdAssignment_1(), "rule__Source__IdAssignment_1");
+					put(grammarAccess.getSourceAccess().getRootTypeAssignment_3(), "rule__Source__RootTypeAssignment_3");
+					put(grammarAccess.getSourceAccess().getInputsAssignment_7(), "rule__Source__InputsAssignment_7");
+					put(grammarAccess.getSourceAccess().getPropertiesAssignment_9(), "rule__Source__PropertiesAssignment_9");
+					put(grammarAccess.getInputAccess().getInputTypeAssignment_1(), "rule__Input__InputTypeAssignment_1");
+					put(grammarAccess.getInputAccess().getFiltersAssignment_3(), "rule__Input__FiltersAssignment_3");
+					put(grammarAccess.getInputAccess().getFiltersAssignment_4_1(), "rule__Input__FiltersAssignment_4_1");
+					put(grammarAccess.getEQFilterAccess().getRootTypePropertyPathAssignment_2(), "rule__EQFilter__RootTypePropertyPathAssignment_2");
+					put(grammarAccess.getEQFilterAccess().getInputTypePropertyPathAssignment_5(), "rule__EQFilter__InputTypePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyAccess().getPathAssignment_1(), "rule__Property__PathAssignment_1");
+					put(grammarAccess.getPropertyAccess().getStyleAssignment_3(), "rule__Property__StyleAssignment_3");
+					put(grammarAccess.getNestedFieldAccess().getFieldAssignment_1(), "rule__NestedField__FieldAssignment_1");
+					put(grammarAccess.getNestedFieldAccess().getPathAssignment_2(), "rule__NestedField__PathAssignment_2");
+					put(grammarAccess.getNestedPathAccess().getFieldAssignment_2(), "rule__NestedPath__FieldAssignment_2");
+					put(grammarAccess.getNestedPathAccess().getPathAssignment_3(), "rule__NestedPath__PathAssignment_3");
+					put(grammarAccess.getPropertyButtonStyleAccess().getEventTopicAssignment_3(), "rule__PropertyButtonStyle__EventTopicAssignment_3");
+					put(grammarAccess.getPropertyDateStyleAccess().getDateFormatAssignment_3(), "rule__PropertyDateStyle__DateFormatAssignment_3");
+					put(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatAssignment_3(), "rule__PropertyNumberStyle__NumberFormatAssignment_3");
+					put(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueAssignment_3(), "rule__PropertyProgressbarStyle__MaxValueAssignment_3");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsAssignment_3(), "rule__GridPropIndicatorStyle__GreenStartsAssignment_3");
+					put(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsAssignment_5(), "rule__GridPropIndicatorStyle__RedEndsAssignment_5");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternAssignment_2(), "rule__PropertyQuantityStyle__HtmlPatternAssignment_2");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathAssignment_5(), "rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatAssignment_6_2(), "rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2");
+					put(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathAssignment_9(), "rule__PropertyQuantityStyle__UomPropertyPathAssignment_9");
+					put(grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternAssignment_2(), "rule__PropertyPriceStyle__HtmlPatternAssignment_2");
+					put(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathAssignment_5(), "rule__PropertyPriceStyle__ValuePropertyPathAssignment_5");
+					put(grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatAssignment_6_2(), "rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2");
+					put(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathAssignment_9(), "rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9");
+					put(grammarAccess.getPropertyImageStyleAccess().getEventTopicAssignment_2_1(), "rule__PropertyImageStyle__EventTopicAssignment_2_1");
+					put(grammarAccess.getPropertyImageStyleAccess().getConfigsAssignment_4(), "rule__PropertyImageStyle__ConfigsAssignment_4");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareAssignment_1(), "rule__NumericToResourceStyleConfig__CompareAssignment_1");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getValueAssignment_2(), "rule__NumericToResourceStyleConfig__ValueAssignment_2");
+					put(grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathAssignment_4(), "rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getCompareAssignment_1(), "rule__StringToResourceStyleConfig__CompareAssignment_1");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getValueAssignment_2(), "rule__StringToResourceStyleConfig__ValueAssignment_2");
+					put(grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathAssignment_4(), "rule__StringToResourceStyleConfig__ResourceThemePathAssignment_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");
+				}
+			};
+		}
+		return nameMappings.get(element);
+	}
+			
+	@Override
+	protected String[] getInitialHiddenTokens() {
+		return new String[] { "RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT" };
+	}
+
+	public GridSourceGrammarAccess getGrammarAccess() {
+		return this.grammarAccess;
+	}
+
+	public void setGrammarAccess(GridSourceGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/PartialGridSourceContentAssistParser.java b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/PartialGridSourceContentAssistParser.java
new file mode 100644
index 0000000..985e987
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/PartialGridSourceContentAssistParser.java
@@ -0,0 +1,34 @@
+/*
+ * generated by Xtext 2.11.0
+ */
+package org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr;
+
+import java.util.Collection;
+import java.util.Collections;
+import org.eclipse.xtext.AbstractRule;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.FollowElement;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.partialEditing.IPartialEditingContentAssistParser;
+import org.eclipse.xtext.util.PolymorphicDispatcher;
+
+public class PartialGridSourceContentAssistParser extends GridSourceParser implements IPartialEditingContentAssistParser {
+
+	private AbstractRule rule;
+
+	@Override
+	public void initializeFor(AbstractRule rule) {
+		this.rule = rule;
+	}
+
+	@Override
+	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+		if (rule == null || rule.eIsProxy())
+			return Collections.emptyList();
+		String methodName = "entryRule" + rule.getName();
+		PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
+			new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
+		dispatcher.invoke();
+		return parser.getFollowElements();
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/internal/InternalGridSource.g b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/internal/InternalGridSource.g
new file mode 100644
index 0000000..0a00a00
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/internal/InternalGridSource.g
@@ -0,0 +1,7234 @@
+/*
+ * generated by Xtext 2.11.0
+ */
+grammar InternalGridSource;
+
+options {
+	superClass=AbstractInternalContentAssistParser;
+	backtrack=true;
+}
+
+@lexer::header {
+package org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+}
+
+@parser::header {
+package org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr.internal;
+
+import java.io.InputStream;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.DFA;
+import org.eclipse.osbp.xtext.gridsource.services.GridSourceGrammarAccess;
+
+}
+@parser::members {
+	private GridSourceGrammarAccess grammarAccess;
+
+	public void setGrammarAccess(GridSourceGrammarAccess grammarAccess) {
+		this.grammarAccess = grammarAccess;
+	}
+
+	@Override
+	protected Grammar getGrammar() {
+		return grammarAccess.getGrammar();
+	}
+
+	@Override
+	protected String getValueForTokenName(String tokenName) {
+		return tokenName;
+	}
+}
+
+// Entry rule entryRuleSource
+entryRuleSource
+:
+{ before(grammarAccess.getSourceRule()); }
+	 ruleSource
+{ after(grammarAccess.getSourceRule()); } 
+	 EOF 
+;
+
+// Rule Source
+ruleSource 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getSourceAccess().getGroup()); }
+		(rule__Source__Group__0)
+		{ after(grammarAccess.getSourceAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleInput
+entryRuleInput
+:
+{ before(grammarAccess.getInputRule()); }
+	 ruleInput
+{ after(grammarAccess.getInputRule()); } 
+	 EOF 
+;
+
+// Rule Input
+ruleInput 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getInputAccess().getGroup()); }
+		(rule__Input__Group__0)
+		{ after(grammarAccess.getInputAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleEQFilter
+entryRuleEQFilter
+:
+{ before(grammarAccess.getEQFilterRule()); }
+	 ruleEQFilter
+{ after(grammarAccess.getEQFilterRule()); } 
+	 EOF 
+;
+
+// Rule EQFilter
+ruleEQFilter 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getEQFilterAccess().getGroup()); }
+		(rule__EQFilter__Group__0)
+		{ after(grammarAccess.getEQFilterAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleProperty
+entryRuleProperty
+:
+{ before(grammarAccess.getPropertyRule()); }
+	 ruleProperty
+{ after(grammarAccess.getPropertyRule()); } 
+	 EOF 
+;
+
+// Rule Property
+ruleProperty 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyAccess().getGroup()); }
+		(rule__Property__Group__0)
+		{ after(grammarAccess.getPropertyAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleNestedField
+entryRuleNestedField
+:
+{ before(grammarAccess.getNestedFieldRule()); }
+	 ruleNestedField
+{ after(grammarAccess.getNestedFieldRule()); } 
+	 EOF 
+;
+
+// Rule NestedField
+ruleNestedField 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getNestedFieldAccess().getGroup()); }
+		(rule__NestedField__Group__0)
+		{ after(grammarAccess.getNestedFieldAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleNestedPath
+entryRuleNestedPath
+:
+{ before(grammarAccess.getNestedPathRule()); }
+	 ruleNestedPath
+{ after(grammarAccess.getNestedPathRule()); } 
+	 EOF 
+;
+
+// Rule NestedPath
+ruleNestedPath 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getNestedPathAccess().getGroup()); }
+		(rule__NestedPath__Group__0)
+		{ after(grammarAccess.getNestedPathAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyStyle
+entryRulePropertyStyle
+:
+{ before(grammarAccess.getPropertyStyleRule()); }
+	 rulePropertyStyle
+{ after(grammarAccess.getPropertyStyleRule()); } 
+	 EOF 
+;
+
+// Rule PropertyStyle
+rulePropertyStyle 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyStyleAccess().getAlternatives()); }
+		(rule__PropertyStyle__Alternatives)
+		{ after(grammarAccess.getPropertyStyleAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyButtonStyle
+entryRulePropertyButtonStyle
+:
+{ before(grammarAccess.getPropertyButtonStyleRule()); }
+	 rulePropertyButtonStyle
+{ after(grammarAccess.getPropertyButtonStyleRule()); } 
+	 EOF 
+;
+
+// Rule PropertyButtonStyle
+rulePropertyButtonStyle 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyButtonStyleAccess().getGroup()); }
+		(rule__PropertyButtonStyle__Group__0)
+		{ after(grammarAccess.getPropertyButtonStyleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyHtmlStyle
+entryRulePropertyHtmlStyle
+:
+{ before(grammarAccess.getPropertyHtmlStyleRule()); }
+	 rulePropertyHtmlStyle
+{ after(grammarAccess.getPropertyHtmlStyleRule()); } 
+	 EOF 
+;
+
+// Rule PropertyHtmlStyle
+rulePropertyHtmlStyle 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyHtmlStyleAccess().getGroup()); }
+		(rule__PropertyHtmlStyle__Group__0)
+		{ after(grammarAccess.getPropertyHtmlStyleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyBooleanStyle
+entryRulePropertyBooleanStyle
+:
+{ before(grammarAccess.getPropertyBooleanStyleRule()); }
+	 rulePropertyBooleanStyle
+{ after(grammarAccess.getPropertyBooleanStyleRule()); } 
+	 EOF 
+;
+
+// Rule PropertyBooleanStyle
+rulePropertyBooleanStyle 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyBooleanStyleAccess().getGroup()); }
+		(rule__PropertyBooleanStyle__Group__0)
+		{ after(grammarAccess.getPropertyBooleanStyleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyDateStyle
+entryRulePropertyDateStyle
+:
+{ before(grammarAccess.getPropertyDateStyleRule()); }
+	 rulePropertyDateStyle
+{ after(grammarAccess.getPropertyDateStyleRule()); } 
+	 EOF 
+;
+
+// Rule PropertyDateStyle
+rulePropertyDateStyle 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyDateStyleAccess().getGroup()); }
+		(rule__PropertyDateStyle__Group__0)
+		{ after(grammarAccess.getPropertyDateStyleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyNumberStyle
+entryRulePropertyNumberStyle
+:
+{ before(grammarAccess.getPropertyNumberStyleRule()); }
+	 rulePropertyNumberStyle
+{ after(grammarAccess.getPropertyNumberStyleRule()); } 
+	 EOF 
+;
+
+// Rule PropertyNumberStyle
+rulePropertyNumberStyle 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyNumberStyleAccess().getGroup()); }
+		(rule__PropertyNumberStyle__Group__0)
+		{ after(grammarAccess.getPropertyNumberStyleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyProgressbarStyle
+entryRulePropertyProgressbarStyle
+:
+{ before(grammarAccess.getPropertyProgressbarStyleRule()); }
+	 rulePropertyProgressbarStyle
+{ after(grammarAccess.getPropertyProgressbarStyleRule()); } 
+	 EOF 
+;
+
+// Rule PropertyProgressbarStyle
+rulePropertyProgressbarStyle 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyProgressbarStyleAccess().getGroup()); }
+		(rule__PropertyProgressbarStyle__Group__0)
+		{ after(grammarAccess.getPropertyProgressbarStyleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleGridPropIndicatorStyle
+entryRuleGridPropIndicatorStyle
+:
+{ before(grammarAccess.getGridPropIndicatorStyleRule()); }
+	 ruleGridPropIndicatorStyle
+{ after(grammarAccess.getGridPropIndicatorStyleRule()); } 
+	 EOF 
+;
+
+// Rule GridPropIndicatorStyle
+ruleGridPropIndicatorStyle 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getGridPropIndicatorStyleAccess().getGroup()); }
+		(rule__GridPropIndicatorStyle__Group__0)
+		{ after(grammarAccess.getGridPropIndicatorStyleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyQuantityStyle
+entryRulePropertyQuantityStyle
+:
+{ before(grammarAccess.getPropertyQuantityStyleRule()); }
+	 rulePropertyQuantityStyle
+{ after(grammarAccess.getPropertyQuantityStyleRule()); } 
+	 EOF 
+;
+
+// Rule PropertyQuantityStyle
+rulePropertyQuantityStyle 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyQuantityStyleAccess().getGroup()); }
+		(rule__PropertyQuantityStyle__Group__0)
+		{ after(grammarAccess.getPropertyQuantityStyleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyPriceStyle
+entryRulePropertyPriceStyle
+:
+{ before(grammarAccess.getPropertyPriceStyleRule()); }
+	 rulePropertyPriceStyle
+{ after(grammarAccess.getPropertyPriceStyleRule()); } 
+	 EOF 
+;
+
+// Rule PropertyPriceStyle
+rulePropertyPriceStyle 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyPriceStyleAccess().getGroup()); }
+		(rule__PropertyPriceStyle__Group__0)
+		{ after(grammarAccess.getPropertyPriceStyleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyTextStyle
+entryRulePropertyTextStyle
+:
+{ before(grammarAccess.getPropertyTextStyleRule()); }
+	 rulePropertyTextStyle
+{ after(grammarAccess.getPropertyTextStyleRule()); } 
+	 EOF 
+;
+
+// Rule PropertyTextStyle
+rulePropertyTextStyle 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyTextStyleAccess().getGroup()); }
+		(rule__PropertyTextStyle__Group__0)
+		{ after(grammarAccess.getPropertyTextStyleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRulePropertyImageStyle
+entryRulePropertyImageStyle
+:
+{ before(grammarAccess.getPropertyImageStyleRule()); }
+	 rulePropertyImageStyle
+{ after(grammarAccess.getPropertyImageStyleRule()); } 
+	 EOF 
+;
+
+// Rule PropertyImageStyle
+rulePropertyImageStyle 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getPropertyImageStyleAccess().getGroup()); }
+		(rule__PropertyImageStyle__Group__0)
+		{ after(grammarAccess.getPropertyImageStyleAccess().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 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 entryRuleStyleConfig
+entryRuleStyleConfig
+:
+{ before(grammarAccess.getStyleConfigRule()); }
+	 ruleStyleConfig
+{ after(grammarAccess.getStyleConfigRule()); } 
+	 EOF 
+;
+
+// Rule StyleConfig
+ruleStyleConfig 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getStyleConfigAccess().getAlternatives()); }
+		(rule__StyleConfig__Alternatives)
+		{ after(grammarAccess.getStyleConfigAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleNumericToResourceStyleConfig
+entryRuleNumericToResourceStyleConfig
+:
+{ before(grammarAccess.getNumericToResourceStyleConfigRule()); }
+	 ruleNumericToResourceStyleConfig
+{ after(grammarAccess.getNumericToResourceStyleConfigRule()); } 
+	 EOF 
+;
+
+// Rule NumericToResourceStyleConfig
+ruleNumericToResourceStyleConfig 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getNumericToResourceStyleConfigAccess().getGroup()); }
+		(rule__NumericToResourceStyleConfig__Group__0)
+		{ after(grammarAccess.getNumericToResourceStyleConfigAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleStringToResourceStyleConfig
+entryRuleStringToResourceStyleConfig
+:
+{ before(grammarAccess.getStringToResourceStyleConfigRule()); }
+	 ruleStringToResourceStyleConfig
+{ after(grammarAccess.getStringToResourceStyleConfigRule()); } 
+	 EOF 
+;
+
+// Rule StringToResourceStyleConfig
+ruleStringToResourceStyleConfig 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getStringToResourceStyleConfigAccess().getGroup()); }
+		(rule__StringToResourceStyleConfig__Group__0)
+		{ after(grammarAccess.getStringToResourceStyleConfigAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLInt
+entryRuleLInt
+:
+{ before(grammarAccess.getLIntRule()); }
+	 ruleLInt
+{ after(grammarAccess.getLIntRule()); } 
+	 EOF 
+;
+
+// Rule LInt
+ruleLInt 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLIntAccess().getGroup()); }
+		(rule__LInt__Group__0)
+		{ after(grammarAccess.getLIntAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleLDouble
+entryRuleLDouble
+:
+{ before(grammarAccess.getLDoubleRule()); }
+	 ruleLDouble
+{ after(grammarAccess.getLDoubleRule()); } 
+	 EOF 
+;
+
+// Rule LDouble
+ruleLDouble 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getLDoubleAccess().getGroup()); }
+		(rule__LDouble__Group__0)
+		{ after(grammarAccess.getLDoubleAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// 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 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 StyleCompare
+ruleStyleCompare
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStyleCompareAccess().getAlternatives()); }
+		(rule__StyleCompare__Alternatives)
+		{ after(grammarAccess.getStyleCompareAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyStyle__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyStyleAccess().getPropertyButtonStyleParserRuleCall_0()); }
+		rulePropertyButtonStyle
+		{ after(grammarAccess.getPropertyStyleAccess().getPropertyButtonStyleParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyStyleAccess().getPropertyHtmlStyleParserRuleCall_1()); }
+		rulePropertyHtmlStyle
+		{ after(grammarAccess.getPropertyStyleAccess().getPropertyHtmlStyleParserRuleCall_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyStyleAccess().getPropertyProgressbarStyleParserRuleCall_2()); }
+		rulePropertyProgressbarStyle
+		{ after(grammarAccess.getPropertyStyleAccess().getPropertyProgressbarStyleParserRuleCall_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyStyleAccess().getPropertyTextStyleParserRuleCall_3()); }
+		rulePropertyTextStyle
+		{ after(grammarAccess.getPropertyStyleAccess().getPropertyTextStyleParserRuleCall_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyStyleAccess().getPropertyBooleanStyleParserRuleCall_4()); }
+		rulePropertyBooleanStyle
+		{ after(grammarAccess.getPropertyStyleAccess().getPropertyBooleanStyleParserRuleCall_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyStyleAccess().getPropertyDateStyleParserRuleCall_5()); }
+		rulePropertyDateStyle
+		{ after(grammarAccess.getPropertyStyleAccess().getPropertyDateStyleParserRuleCall_5()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyStyleAccess().getPropertyNumberStyleParserRuleCall_6()); }
+		rulePropertyNumberStyle
+		{ after(grammarAccess.getPropertyStyleAccess().getPropertyNumberStyleParserRuleCall_6()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyStyleAccess().getPropertyImageStyleParserRuleCall_7()); }
+		rulePropertyImageStyle
+		{ after(grammarAccess.getPropertyStyleAccess().getPropertyImageStyleParserRuleCall_7()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyStyleAccess().getPropertyQuantityStyleParserRuleCall_8()); }
+		rulePropertyQuantityStyle
+		{ after(grammarAccess.getPropertyStyleAccess().getPropertyQuantityStyleParserRuleCall_8()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyStyleAccess().getPropertyPriceStyleParserRuleCall_9()); }
+		rulePropertyPriceStyle
+		{ after(grammarAccess.getPropertyStyleAccess().getPropertyPriceStyleParserRuleCall_9()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getPropertyStyleAccess().getGridPropIndicatorStyleParserRuleCall_10()); }
+		ruleGridPropIndicatorStyle
+		{ after(grammarAccess.getPropertyStyleAccess().getGridPropIndicatorStyleParserRuleCall_10()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StyleConfig__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStyleConfigAccess().getNumericToResourceStyleConfigParserRuleCall_0()); }
+		ruleNumericToResourceStyleConfig
+		{ after(grammarAccess.getStyleConfigAccess().getNumericToResourceStyleConfigParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStyleConfigAccess().getStringToResourceStyleConfigParserRuleCall_1()); }
+		ruleStringToResourceStyleConfig
+		{ after(grammarAccess.getStyleConfigAccess().getStringToResourceStyleConfigParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LInt__Alternatives_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getLIntAccess().getPlusSignKeyword_0_0()); }
+		'+'
+		{ after(grammarAccess.getLIntAccess().getPlusSignKeyword_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getLIntAccess().getHyphenMinusKeyword_0_1()); }
+		'-'
+		{ after(grammarAccess.getLIntAccess().getHyphenMinusKeyword_0_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__StyleCompare__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0()); }
+		('equal')
+		{ after(grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1()); }
+		('greater equal')
+		{ after(grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2()); }
+		('greater than')
+		{ after(grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3()); }
+		('lower equal')
+		{ after(grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4()); }
+		('lower than')
+		{ after(grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5()); }
+		('not equal')
+		{ after(grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Source__Group__0__Impl
+	rule__Source__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSourceAccess().getGridsourceKeyword_0()); }
+	'gridsource'
+	{ after(grammarAccess.getSourceAccess().getGridsourceKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Source__Group__1__Impl
+	rule__Source__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSourceAccess().getIdAssignment_1()); }
+	(rule__Source__IdAssignment_1)
+	{ after(grammarAccess.getSourceAccess().getIdAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Source__Group__2__Impl
+	rule__Source__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSourceAccess().getForKeyword_2()); }
+	'for'
+	{ after(grammarAccess.getSourceAccess().getForKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Source__Group__3__Impl
+	rule__Source__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSourceAccess().getRootTypeAssignment_3()); }
+	(rule__Source__RootTypeAssignment_3)
+	{ after(grammarAccess.getSourceAccess().getRootTypeAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Source__Group__4__Impl
+	rule__Source__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_4()); }
+	'{'
+	{ after(grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Source__Group__5__Impl
+	rule__Source__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSourceAccess().getInputsKeyword_5()); }
+	'inputs'
+	{ after(grammarAccess.getSourceAccess().getInputsKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Source__Group__6__Impl
+	rule__Source__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_6()); }
+	'{'
+	{ after(grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Source__Group__7__Impl
+	rule__Source__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSourceAccess().getInputsAssignment_7()); }
+	(rule__Source__InputsAssignment_7)*
+	{ after(grammarAccess.getSourceAccess().getInputsAssignment_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Source__Group__8__Impl
+	rule__Source__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_8()); }
+	'}'
+	{ after(grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Source__Group__9__Impl
+	rule__Source__Group__10
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSourceAccess().getPropertiesAssignment_9()); }
+	(rule__Source__PropertiesAssignment_9)*
+	{ after(grammarAccess.getSourceAccess().getPropertiesAssignment_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__10
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Source__Group__10__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__Group__10__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_10()); }
+	'}'
+	{ after(grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_10()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Input__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Input__Group__0__Impl
+	rule__Input__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputAccess().getInputTypeKeyword_0()); }
+	'inputType'
+	{ after(grammarAccess.getInputAccess().getInputTypeKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Input__Group__1__Impl
+	rule__Input__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputAccess().getInputTypeAssignment_1()); }
+	(rule__Input__InputTypeAssignment_1)
+	{ after(grammarAccess.getInputAccess().getInputTypeAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Input__Group__2__Impl
+	rule__Input__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputAccess().getFiltersKeyword_2()); }
+	'filters'
+	{ after(grammarAccess.getInputAccess().getFiltersKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Input__Group__3__Impl
+	rule__Input__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputAccess().getFiltersAssignment_3()); }
+	(rule__Input__FiltersAssignment_3)
+	{ after(grammarAccess.getInputAccess().getFiltersAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Input__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputAccess().getGroup_4()); }
+	(rule__Input__Group_4__0)*
+	{ after(grammarAccess.getInputAccess().getGroup_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Input__Group_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Input__Group_4__0__Impl
+	rule__Input__Group_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__Group_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputAccess().getAmpersandAmpersandKeyword_4_0()); }
+	'&&'
+	{ after(grammarAccess.getInputAccess().getAmpersandAmpersandKeyword_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__Group_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Input__Group_4__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__Group_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getInputAccess().getFiltersAssignment_4_1()); }
+	(rule__Input__FiltersAssignment_4_1)
+	{ after(grammarAccess.getInputAccess().getFiltersAssignment_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__EQFilter__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EQFilter__Group__0__Impl
+	rule__EQFilter__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EQFilter__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEQFilterAccess().getCxGridSourceEQFilterAction_0()); }
+	()
+	{ after(grammarAccess.getEQFilterAccess().getCxGridSourceEQFilterAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EQFilter__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EQFilter__Group__1__Impl
+	rule__EQFilter__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EQFilter__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEQFilterAccess().getRootKeyword_1()); }
+	'root:'
+	{ after(grammarAccess.getEQFilterAccess().getRootKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EQFilter__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EQFilter__Group__2__Impl
+	rule__EQFilter__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EQFilter__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEQFilterAccess().getRootTypePropertyPathAssignment_2()); }
+	(rule__EQFilter__RootTypePropertyPathAssignment_2)
+	{ after(grammarAccess.getEQFilterAccess().getRootTypePropertyPathAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EQFilter__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EQFilter__Group__3__Impl
+	rule__EQFilter__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EQFilter__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEQFilterAccess().getEqualsSignKeyword_3()); }
+	'='
+	{ after(grammarAccess.getEQFilterAccess().getEqualsSignKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EQFilter__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EQFilter__Group__4__Impl
+	rule__EQFilter__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EQFilter__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEQFilterAccess().getInputKeyword_4()); }
+	'input:'
+	{ after(grammarAccess.getEQFilterAccess().getInputKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EQFilter__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__EQFilter__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EQFilter__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getEQFilterAccess().getInputTypePropertyPathAssignment_5()); }
+	(rule__EQFilter__InputTypePropertyPathAssignment_5)
+	{ after(grammarAccess.getEQFilterAccess().getInputTypePropertyPathAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Property__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Property__Group__0__Impl
+	rule__Property__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Property__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyAccess().getPropKeyword_0()); }
+	'prop'
+	{ after(grammarAccess.getPropertyAccess().getPropKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Property__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Property__Group__1__Impl
+	rule__Property__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Property__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyAccess().getPathAssignment_1()); }
+	(rule__Property__PathAssignment_1)
+	{ after(grammarAccess.getPropertyAccess().getPathAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Property__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Property__Group__2__Impl
+	rule__Property__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Property__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyAccess().getStyleKeyword_2()); }
+	'style'
+	{ after(grammarAccess.getPropertyAccess().getStyleKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Property__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__Property__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Property__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyAccess().getStyleAssignment_3()); }
+	(rule__Property__StyleAssignment_3)
+	{ after(grammarAccess.getPropertyAccess().getStyleAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__NestedField__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NestedField__Group__0__Impl
+	rule__NestedField__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedField__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNestedFieldAccess().getCxGridNestedFieldAction_0()); }
+	()
+	{ after(grammarAccess.getNestedFieldAccess().getCxGridNestedFieldAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedField__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NestedField__Group__1__Impl
+	rule__NestedField__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedField__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNestedFieldAccess().getFieldAssignment_1()); }
+	(rule__NestedField__FieldAssignment_1)
+	{ after(grammarAccess.getNestedFieldAccess().getFieldAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedField__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NestedField__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedField__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNestedFieldAccess().getPathAssignment_2()); }
+	(rule__NestedField__PathAssignment_2)?
+	{ after(grammarAccess.getNestedFieldAccess().getPathAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__NestedPath__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NestedPath__Group__0__Impl
+	rule__NestedPath__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedPath__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNestedPathAccess().getCxGridNestedPathAction_0()); }
+	()
+	{ after(grammarAccess.getNestedPathAccess().getCxGridNestedPathAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedPath__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NestedPath__Group__1__Impl
+	rule__NestedPath__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedPath__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNestedPathAccess().getFullStopKeyword_1()); }
+	'.'
+	{ after(grammarAccess.getNestedPathAccess().getFullStopKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedPath__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NestedPath__Group__2__Impl
+	rule__NestedPath__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedPath__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNestedPathAccess().getFieldAssignment_2()); }
+	(rule__NestedPath__FieldAssignment_2)
+	{ after(grammarAccess.getNestedPathAccess().getFieldAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedPath__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NestedPath__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedPath__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNestedPathAccess().getPathAssignment_3()); }
+	(rule__NestedPath__PathAssignment_3)?
+	{ after(grammarAccess.getNestedPathAccess().getPathAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyButtonStyle__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyButtonStyle__Group__0__Impl
+	rule__PropertyButtonStyle__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyButtonStyle__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyButtonStyleAccess().getCxGridPropButtonStyleAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyButtonStyleAccess().getCxGridPropButtonStyleAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyButtonStyle__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyButtonStyle__Group__1__Impl
+	rule__PropertyButtonStyle__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyButtonStyle__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyButtonStyleAccess().getButtonStyleKeyword_1()); }
+	'buttonStyle'
+	{ after(grammarAccess.getPropertyButtonStyleAccess().getButtonStyleKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyButtonStyle__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyButtonStyle__Group__2__Impl
+	rule__PropertyButtonStyle__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyButtonStyle__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyButtonStyleAccess().getEventTopicKeyword_2()); }
+	'eventTopic'
+	{ after(grammarAccess.getPropertyButtonStyleAccess().getEventTopicKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyButtonStyle__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyButtonStyle__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyButtonStyle__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyButtonStyleAccess().getEventTopicAssignment_3()); }
+	(rule__PropertyButtonStyle__EventTopicAssignment_3)
+	{ after(grammarAccess.getPropertyButtonStyleAccess().getEventTopicAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyHtmlStyle__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyHtmlStyle__Group__0__Impl
+	rule__PropertyHtmlStyle__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyHtmlStyle__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyHtmlStyleAccess().getCxGridPropHtmlStyleAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyHtmlStyleAccess().getCxGridPropHtmlStyleAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyHtmlStyle__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyHtmlStyle__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyHtmlStyle__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyHtmlStyleAccess().getHtmlStyleKeyword_1()); }
+	'htmlStyle'
+	{ after(grammarAccess.getPropertyHtmlStyleAccess().getHtmlStyleKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyBooleanStyle__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyBooleanStyle__Group__0__Impl
+	rule__PropertyBooleanStyle__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyBooleanStyle__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyBooleanStyleAccess().getCxGridPropBooleanStyleAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyBooleanStyleAccess().getCxGridPropBooleanStyleAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyBooleanStyle__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyBooleanStyle__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyBooleanStyle__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyBooleanStyleAccess().getBoolStyleKeyword_1()); }
+	'boolStyle'
+	{ after(grammarAccess.getPropertyBooleanStyleAccess().getBoolStyleKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyDateStyle__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyDateStyle__Group__0__Impl
+	rule__PropertyDateStyle__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyDateStyle__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyDateStyleAccess().getCxGridPropDateStyleAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyDateStyleAccess().getCxGridPropDateStyleAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyDateStyle__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyDateStyle__Group__1__Impl
+	rule__PropertyDateStyle__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyDateStyle__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyDateStyleAccess().getDateStyleKeyword_1()); }
+	'dateStyle'
+	{ after(grammarAccess.getPropertyDateStyleAccess().getDateStyleKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyDateStyle__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyDateStyle__Group__2__Impl
+	rule__PropertyDateStyle__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyDateStyle__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyDateStyleAccess().getFormatKeyword_2()); }
+	'format'
+	{ after(grammarAccess.getPropertyDateStyleAccess().getFormatKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyDateStyle__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyDateStyle__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyDateStyle__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyDateStyleAccess().getDateFormatAssignment_3()); }
+	(rule__PropertyDateStyle__DateFormatAssignment_3)
+	{ after(grammarAccess.getPropertyDateStyleAccess().getDateFormatAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyNumberStyle__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyNumberStyle__Group__0__Impl
+	rule__PropertyNumberStyle__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyNumberStyle__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyNumberStyleAccess().getCxGridPropNumberStyleAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyNumberStyleAccess().getCxGridPropNumberStyleAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyNumberStyle__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyNumberStyle__Group__1__Impl
+	rule__PropertyNumberStyle__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyNumberStyle__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyNumberStyleAccess().getNumberStyleKeyword_1()); }
+	'numberStyle'
+	{ after(grammarAccess.getPropertyNumberStyleAccess().getNumberStyleKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyNumberStyle__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyNumberStyle__Group__2__Impl
+	rule__PropertyNumberStyle__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyNumberStyle__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyNumberStyleAccess().getFormatKeyword_2()); }
+	'format'
+	{ after(grammarAccess.getPropertyNumberStyleAccess().getFormatKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyNumberStyle__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyNumberStyle__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyNumberStyle__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatAssignment_3()); }
+	(rule__PropertyNumberStyle__NumberFormatAssignment_3)
+	{ after(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyProgressbarStyle__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyProgressbarStyle__Group__0__Impl
+	rule__PropertyProgressbarStyle__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyProgressbarStyle__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyProgressbarStyleAccess().getCxGridPropProgressbarStyleAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyProgressbarStyleAccess().getCxGridPropProgressbarStyleAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyProgressbarStyle__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyProgressbarStyle__Group__1__Impl
+	rule__PropertyProgressbarStyle__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyProgressbarStyle__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyProgressbarStyleAccess().getProgressbarStyleKeyword_1()); }
+	'progressbarStyle'
+	{ after(grammarAccess.getPropertyProgressbarStyleAccess().getProgressbarStyleKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyProgressbarStyle__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyProgressbarStyle__Group__2__Impl
+	rule__PropertyProgressbarStyle__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyProgressbarStyle__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyProgressbarStyleAccess().getMaxKeyword_2()); }
+	'max'
+	{ after(grammarAccess.getPropertyProgressbarStyleAccess().getMaxKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyProgressbarStyle__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyProgressbarStyle__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyProgressbarStyle__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueAssignment_3()); }
+	(rule__PropertyProgressbarStyle__MaxValueAssignment_3)
+	{ after(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__GridPropIndicatorStyle__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__GridPropIndicatorStyle__Group__0__Impl
+	rule__GridPropIndicatorStyle__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GridPropIndicatorStyle__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getGridPropIndicatorStyleAccess().getCxGridPropIndicatorStyleAction_0()); }
+	()
+	{ after(grammarAccess.getGridPropIndicatorStyleAccess().getCxGridPropIndicatorStyleAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GridPropIndicatorStyle__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__GridPropIndicatorStyle__Group__1__Impl
+	rule__GridPropIndicatorStyle__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GridPropIndicatorStyle__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getGridPropIndicatorStyleAccess().getIndicatorStyleKeyword_1()); }
+	'indicatorStyle'
+	{ after(grammarAccess.getGridPropIndicatorStyleAccess().getIndicatorStyleKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GridPropIndicatorStyle__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__GridPropIndicatorStyle__Group__2__Impl
+	rule__GridPropIndicatorStyle__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GridPropIndicatorStyle__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getGridPropIndicatorStyleAccess().getGreenFromKeyword_2()); }
+	'greenFrom'
+	{ after(grammarAccess.getGridPropIndicatorStyleAccess().getGreenFromKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GridPropIndicatorStyle__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__GridPropIndicatorStyle__Group__3__Impl
+	rule__GridPropIndicatorStyle__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GridPropIndicatorStyle__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsAssignment_3()); }
+	(rule__GridPropIndicatorStyle__GreenStartsAssignment_3)
+	{ after(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsAssignment_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GridPropIndicatorStyle__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__GridPropIndicatorStyle__Group__4__Impl
+	rule__GridPropIndicatorStyle__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GridPropIndicatorStyle__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getGridPropIndicatorStyleAccess().getRedUntilKeyword_4()); }
+	'redUntil'
+	{ after(grammarAccess.getGridPropIndicatorStyleAccess().getRedUntilKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GridPropIndicatorStyle__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__GridPropIndicatorStyle__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GridPropIndicatorStyle__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsAssignment_5()); }
+	(rule__GridPropIndicatorStyle__RedEndsAssignment_5)
+	{ after(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyQuantityStyle__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyQuantityStyle__Group__0__Impl
+	rule__PropertyQuantityStyle__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyQuantityStyleAccess().getCxGridPropQuantityStyleAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyQuantityStyleAccess().getCxGridPropQuantityStyleAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyQuantityStyle__Group__1__Impl
+	rule__PropertyQuantityStyle__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyQuantityStyleAccess().getQuantityStyleKeyword_1()); }
+	'quantityStyle'
+	{ after(grammarAccess.getPropertyQuantityStyleAccess().getQuantityStyleKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyQuantityStyle__Group__2__Impl
+	rule__PropertyQuantityStyle__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternAssignment_2()); }
+	(rule__PropertyQuantityStyle__HtmlPatternAssignment_2)?
+	{ after(grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyQuantityStyle__Group__3__Impl
+	rule__PropertyQuantityStyle__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyQuantityStyleAccess().getValueKeyword_3()); }
+	'value'
+	{ after(grammarAccess.getPropertyQuantityStyleAccess().getValueKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyQuantityStyle__Group__4__Impl
+	rule__PropertyQuantityStyle__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_4()); }
+	'='
+	{ after(grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyQuantityStyle__Group__5__Impl
+	rule__PropertyQuantityStyle__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathAssignment_5()); }
+	(rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5)
+	{ after(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyQuantityStyle__Group__6__Impl
+	rule__PropertyQuantityStyle__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyQuantityStyleAccess().getGroup_6()); }
+	(rule__PropertyQuantityStyle__Group_6__0)?
+	{ after(grammarAccess.getPropertyQuantityStyleAccess().getGroup_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyQuantityStyle__Group__7__Impl
+	rule__PropertyQuantityStyle__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyQuantityStyleAccess().getUomKeyword_7()); }
+	'uom'
+	{ after(grammarAccess.getPropertyQuantityStyleAccess().getUomKeyword_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyQuantityStyle__Group__8__Impl
+	rule__PropertyQuantityStyle__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_8()); }
+	'='
+	{ after(grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyQuantityStyle__Group__9__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathAssignment_9()); }
+	(rule__PropertyQuantityStyle__UomPropertyPathAssignment_9)
+	{ after(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathAssignment_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyQuantityStyle__Group_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyQuantityStyle__Group_6__0__Impl
+	rule__PropertyQuantityStyle__Group_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyQuantityStyleAccess().getLeftParenthesisKeyword_6_0()); }
+	'('
+	{ after(grammarAccess.getPropertyQuantityStyleAccess().getLeftParenthesisKeyword_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyQuantityStyle__Group_6__1__Impl
+	rule__PropertyQuantityStyle__Group_6__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyQuantityStyleAccess().getFormatKeyword_6_1()); }
+	'format'
+	{ after(grammarAccess.getPropertyQuantityStyleAccess().getFormatKeyword_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group_6__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyQuantityStyle__Group_6__2__Impl
+	rule__PropertyQuantityStyle__Group_6__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group_6__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatAssignment_6_2()); }
+	(rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2)
+	{ after(grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatAssignment_6_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group_6__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyQuantityStyle__Group_6__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__Group_6__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyQuantityStyleAccess().getRightParenthesisKeyword_6_3()); }
+	')'
+	{ after(grammarAccess.getPropertyQuantityStyleAccess().getRightParenthesisKeyword_6_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyPriceStyle__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyPriceStyle__Group__0__Impl
+	rule__PropertyPriceStyle__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyPriceStyleAccess().getCxGridPropPriceStyleAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyPriceStyleAccess().getCxGridPropPriceStyleAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyPriceStyle__Group__1__Impl
+	rule__PropertyPriceStyle__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyPriceStyleAccess().getPriceStyleKeyword_1()); }
+	'priceStyle'
+	{ after(grammarAccess.getPropertyPriceStyleAccess().getPriceStyleKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyPriceStyle__Group__2__Impl
+	rule__PropertyPriceStyle__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternAssignment_2()); }
+	(rule__PropertyPriceStyle__HtmlPatternAssignment_2)?
+	{ after(grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyPriceStyle__Group__3__Impl
+	rule__PropertyPriceStyle__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyPriceStyleAccess().getValueKeyword_3()); }
+	'value'
+	{ after(grammarAccess.getPropertyPriceStyleAccess().getValueKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyPriceStyle__Group__4__Impl
+	rule__PropertyPriceStyle__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_4()); }
+	'='
+	{ after(grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyPriceStyle__Group__5__Impl
+	rule__PropertyPriceStyle__Group__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathAssignment_5()); }
+	(rule__PropertyPriceStyle__ValuePropertyPathAssignment_5)
+	{ after(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathAssignment_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyPriceStyle__Group__6__Impl
+	rule__PropertyPriceStyle__Group__7
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyPriceStyleAccess().getGroup_6()); }
+	(rule__PropertyPriceStyle__Group_6__0)?
+	{ after(grammarAccess.getPropertyPriceStyleAccess().getGroup_6()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyPriceStyle__Group__7__Impl
+	rule__PropertyPriceStyle__Group__8
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__7__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyPriceStyleAccess().getCurrencyKeyword_7()); }
+	'currency'
+	{ after(grammarAccess.getPropertyPriceStyleAccess().getCurrencyKeyword_7()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__8
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyPriceStyle__Group__8__Impl
+	rule__PropertyPriceStyle__Group__9
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__8__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_8()); }
+	'='
+	{ after(grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_8()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyPriceStyle__Group__9__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group__9__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathAssignment_9()); }
+	(rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9)
+	{ after(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathAssignment_9()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyPriceStyle__Group_6__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyPriceStyle__Group_6__0__Impl
+	rule__PropertyPriceStyle__Group_6__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group_6__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyPriceStyleAccess().getLeftParenthesisKeyword_6_0()); }
+	'('
+	{ after(grammarAccess.getPropertyPriceStyleAccess().getLeftParenthesisKeyword_6_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group_6__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyPriceStyle__Group_6__1__Impl
+	rule__PropertyPriceStyle__Group_6__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group_6__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyPriceStyleAccess().getFormatKeyword_6_1()); }
+	'format'
+	{ after(grammarAccess.getPropertyPriceStyleAccess().getFormatKeyword_6_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group_6__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyPriceStyle__Group_6__2__Impl
+	rule__PropertyPriceStyle__Group_6__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group_6__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatAssignment_6_2()); }
+	(rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2)
+	{ after(grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatAssignment_6_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group_6__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyPriceStyle__Group_6__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__Group_6__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyPriceStyleAccess().getRightParenthesisKeyword_6_3()); }
+	')'
+	{ after(grammarAccess.getPropertyPriceStyleAccess().getRightParenthesisKeyword_6_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyTextStyle__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyTextStyle__Group__0__Impl
+	rule__PropertyTextStyle__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyTextStyle__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyTextStyleAccess().getCxGridPropTextStyleAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyTextStyleAccess().getCxGridPropTextStyleAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyTextStyle__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyTextStyle__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyTextStyle__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyTextStyleAccess().getTextStyleKeyword_1()); }
+	'textStyle'
+	{ after(grammarAccess.getPropertyTextStyleAccess().getTextStyleKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyImageStyle__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyImageStyle__Group__0__Impl
+	rule__PropertyImageStyle__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyImageStyleAccess().getCxGridPropImageStyleAction_0()); }
+	()
+	{ after(grammarAccess.getPropertyImageStyleAccess().getCxGridPropImageStyleAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyImageStyle__Group__1__Impl
+	rule__PropertyImageStyle__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyImageStyleAccess().getImageStyleKeyword_1()); }
+	'imageStyle'
+	{ after(grammarAccess.getPropertyImageStyleAccess().getImageStyleKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyImageStyle__Group__2__Impl
+	rule__PropertyImageStyle__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyImageStyleAccess().getGroup_2()); }
+	(rule__PropertyImageStyle__Group_2__0)?
+	{ after(grammarAccess.getPropertyImageStyleAccess().getGroup_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyImageStyle__Group__3__Impl
+	rule__PropertyImageStyle__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyImageStyleAccess().getLeftCurlyBracketKeyword_3()); }
+	'{'
+	{ after(grammarAccess.getPropertyImageStyleAccess().getLeftCurlyBracketKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyImageStyle__Group__4__Impl
+	rule__PropertyImageStyle__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyImageStyleAccess().getConfigsAssignment_4()); }
+	(rule__PropertyImageStyle__ConfigsAssignment_4)*
+	{ after(grammarAccess.getPropertyImageStyleAccess().getConfigsAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyImageStyle__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyImageStyleAccess().getRightCurlyBracketKeyword_5()); }
+	'}'
+	{ after(grammarAccess.getPropertyImageStyleAccess().getRightCurlyBracketKeyword_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__PropertyImageStyle__Group_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyImageStyle__Group_2__0__Impl
+	rule__PropertyImageStyle__Group_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__Group_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyImageStyleAccess().getEventTopicKeyword_2_0()); }
+	'eventTopic'
+	{ after(grammarAccess.getPropertyImageStyleAccess().getEventTopicKeyword_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__Group_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__PropertyImageStyle__Group_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__Group_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getPropertyImageStyleAccess().getEventTopicAssignment_2_1()); }
+	(rule__PropertyImageStyle__EventTopicAssignment_2_1)
+	{ after(grammarAccess.getPropertyImageStyleAccess().getEventTopicAssignment_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__QualifiedName__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedName__Group__0__Impl
+	rule__QualifiedName__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedName__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); }
+	ruleValidID
+	{ after(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedName__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedName__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedName__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameAccess().getGroup_1()); }
+	(rule__QualifiedName__Group_1__0)*
+	{ after(grammarAccess.getQualifiedNameAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__QualifiedName__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedName__Group_1__0__Impl
+	rule__QualifiedName__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedName__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); }
+	('.')
+	{ after(grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedName__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedName__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedName__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); }
+	ruleValidID
+	{ after(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__NumericToResourceStyleConfig__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NumericToResourceStyleConfig__Group__0__Impl
+	rule__NumericToResourceStyleConfig__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NumericToResourceStyleConfig__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNumericToResourceStyleConfigAccess().getNumberKeyword_0()); }
+	'number'
+	{ after(grammarAccess.getNumericToResourceStyleConfigAccess().getNumberKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NumericToResourceStyleConfig__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NumericToResourceStyleConfig__Group__1__Impl
+	rule__NumericToResourceStyleConfig__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NumericToResourceStyleConfig__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareAssignment_1()); }
+	(rule__NumericToResourceStyleConfig__CompareAssignment_1)
+	{ after(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NumericToResourceStyleConfig__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NumericToResourceStyleConfig__Group__2__Impl
+	rule__NumericToResourceStyleConfig__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NumericToResourceStyleConfig__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNumericToResourceStyleConfigAccess().getValueAssignment_2()); }
+	(rule__NumericToResourceStyleConfig__ValueAssignment_2)
+	{ after(grammarAccess.getNumericToResourceStyleConfigAccess().getValueAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NumericToResourceStyleConfig__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NumericToResourceStyleConfig__Group__3__Impl
+	rule__NumericToResourceStyleConfig__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NumericToResourceStyleConfig__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNumericToResourceStyleConfigAccess().getThenKeyword_3()); }
+	'then'
+	{ after(grammarAccess.getNumericToResourceStyleConfigAccess().getThenKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NumericToResourceStyleConfig__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__NumericToResourceStyleConfig__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NumericToResourceStyleConfig__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathAssignment_4()); }
+	(rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4)
+	{ after(grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__StringToResourceStyleConfig__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StringToResourceStyleConfig__Group__0__Impl
+	rule__StringToResourceStyleConfig__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringToResourceStyleConfig__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStringToResourceStyleConfigAccess().getStringKeyword_0()); }
+	'string'
+	{ after(grammarAccess.getStringToResourceStyleConfigAccess().getStringKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringToResourceStyleConfig__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StringToResourceStyleConfig__Group__1__Impl
+	rule__StringToResourceStyleConfig__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringToResourceStyleConfig__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStringToResourceStyleConfigAccess().getCompareAssignment_1()); }
+	(rule__StringToResourceStyleConfig__CompareAssignment_1)
+	{ after(grammarAccess.getStringToResourceStyleConfigAccess().getCompareAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringToResourceStyleConfig__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StringToResourceStyleConfig__Group__2__Impl
+	rule__StringToResourceStyleConfig__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringToResourceStyleConfig__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStringToResourceStyleConfigAccess().getValueAssignment_2()); }
+	(rule__StringToResourceStyleConfig__ValueAssignment_2)
+	{ after(grammarAccess.getStringToResourceStyleConfigAccess().getValueAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringToResourceStyleConfig__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StringToResourceStyleConfig__Group__3__Impl
+	rule__StringToResourceStyleConfig__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringToResourceStyleConfig__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStringToResourceStyleConfigAccess().getThenKeyword_3()); }
+	'then'
+	{ after(grammarAccess.getStringToResourceStyleConfigAccess().getThenKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringToResourceStyleConfig__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__StringToResourceStyleConfig__Group__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringToResourceStyleConfig__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathAssignment_4()); }
+	(rule__StringToResourceStyleConfig__ResourceThemePathAssignment_4)
+	{ after(grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LInt__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LInt__Group__0__Impl
+	rule__LInt__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LInt__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLIntAccess().getAlternatives_0()); }
+	(rule__LInt__Alternatives_0)?
+	{ after(grammarAccess.getLIntAccess().getAlternatives_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LInt__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LInt__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LInt__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLIntAccess().getINTTerminalRuleCall_1()); }
+	RULE_INT
+	{ after(grammarAccess.getLIntAccess().getINTTerminalRuleCall_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LDouble__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LDouble__Group__0__Impl
+	rule__LDouble__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LDouble__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLDoubleAccess().getLIntParserRuleCall_0()); }
+	ruleLInt
+	{ after(grammarAccess.getLDoubleAccess().getLIntParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LDouble__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LDouble__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LDouble__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLDoubleAccess().getGroup_1()); }
+	(rule__LDouble__Group_1__0)?
+	{ after(grammarAccess.getLDoubleAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__LDouble__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LDouble__Group_1__0__Impl
+	rule__LDouble__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LDouble__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLDoubleAccess().getFullStopKeyword_1_0()); }
+	'.'
+	{ after(grammarAccess.getLDoubleAccess().getFullStopKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LDouble__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__LDouble__Group_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__LDouble__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getLDoubleAccess().getINTTerminalRuleCall_1_1()); }
+	RULE_INT
+	{ after(grammarAccess.getLDoubleAccess().getINTTerminalRuleCall_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmTypeReference__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmTypeReference__Group_0__0__Impl
+	rule__JvmTypeReference__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0()); }
+	ruleJvmParameterizedTypeReference
+	{ after(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmTypeReference__Group_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1()); }
+	(rule__JvmTypeReference__Group_0_1__0)*
+	{ after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmTypeReference__Group_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmTypeReference__Group_0_1__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Group_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1_0()); }
+	(rule__JvmTypeReference__Group_0_1_0__0)
+	{ after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmTypeReference__Group_0_1_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmTypeReference__Group_0_1_0__0__Impl
+	rule__JvmTypeReference__Group_0_1_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Group_0_1_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()); }
+	()
+	{ after(grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Group_0_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmTypeReference__Group_0_1_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmTypeReference__Group_0_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1()); }
+	ruleArrayBrackets
+	{ after(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__ArrayBrackets__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ArrayBrackets__Group__0__Impl
+	rule__ArrayBrackets__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ArrayBrackets__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0()); }
+	'['
+	{ after(grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ArrayBrackets__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__ArrayBrackets__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__ArrayBrackets__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1()); }
+	']'
+	{ after(grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XFunctionTypeRef__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group__0__Impl
+	rule__XFunctionTypeRef__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0()); }
+	(rule__XFunctionTypeRef__Group_0__0)?
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getGroup_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group__1__Impl
+	rule__XFunctionTypeRef__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1()); }
+	'=>'
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeAssignment_2()); }
+	(rule__XFunctionTypeRef__ReturnTypeAssignment_2)
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XFunctionTypeRef__Group_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group_0__0__Impl
+	rule__XFunctionTypeRef__Group_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0()); }
+	'('
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group_0__1__Impl
+	rule__XFunctionTypeRef__Group_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1()); }
+	(rule__XFunctionTypeRef__Group_0_1__0)?
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group_0__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2()); }
+	')'
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XFunctionTypeRef__Group_0_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group_0_1__0__Impl
+	rule__XFunctionTypeRef__Group_0_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_0()); }
+	(rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0)
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group_0_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1_1()); }
+	(rule__XFunctionTypeRef__Group_0_1_1__0)*
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XFunctionTypeRef__Group_0_1_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group_0_1_1__0__Impl
+	rule__XFunctionTypeRef__Group_0_1_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0_1_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0()); }
+	','
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0_1_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XFunctionTypeRef__Group_0_1_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__Group_0_1_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_1_1()); }
+	(rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1)
+	{ after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group__0__Impl
+	rule__JvmParameterizedTypeReference__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_0()); }
+	(rule__JvmParameterizedTypeReference__TypeAssignment_0)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1()); }
+	(rule__JvmParameterizedTypeReference__Group_1__0)?
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1__0__Impl
+	rule__JvmParameterizedTypeReference__Group_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0()); }
+	('<')
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1__1__Impl
+	rule__JvmParameterizedTypeReference__Group_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_1()); }
+	(rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1__2__Impl
+	rule__JvmParameterizedTypeReference__Group_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_2()); }
+	(rule__JvmParameterizedTypeReference__Group_1_2__0)*
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1__3__Impl
+	rule__JvmParameterizedTypeReference__Group_1__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3()); }
+	'>'
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1__4__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4()); }
+	(rule__JvmParameterizedTypeReference__Group_1_4__0)*
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group_1_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_2__0__Impl
+	rule__JvmParameterizedTypeReference__Group_1_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0()); }
+	','
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_2_1()); }
+	(rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group_1_4__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4__0__Impl
+	rule__JvmParameterizedTypeReference__Group_1_4__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0()); }
+	(rule__JvmParameterizedTypeReference__Group_1_4_0__0)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4__1__Impl
+	rule__JvmParameterizedTypeReference__Group_1_4__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_1_4_1()); }
+	(rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_1_4_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2()); }
+	(rule__JvmParameterizedTypeReference__Group_1_4_2__0)?
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group_1_4_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0_0()); }
+	(rule__JvmParameterizedTypeReference__Group_1_4_0_0__0)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group_1_4_0_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl
+	rule__JvmParameterizedTypeReference__Group_1_4_0_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0()); }
+	()
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_0_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1()); }
+	'.'
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl
+	rule__JvmParameterizedTypeReference__Group_1_4_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0()); }
+	('<')
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl
+	rule__JvmParameterizedTypeReference__Group_1_4_2__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_1()); }
+	(rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl
+	rule__JvmParameterizedTypeReference__Group_1_4_2__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2_2()); }
+	(rule__JvmParameterizedTypeReference__Group_1_4_2_2__0)*
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3()); }
+	'>'
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmParameterizedTypeReference__Group_1_4_2_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl
+	rule__JvmParameterizedTypeReference__Group_1_4_2_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0()); }
+	','
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2_2__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_2_1()); }
+	(rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1)
+	{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_2_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmWildcardTypeReference__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmWildcardTypeReference__Group__0__Impl
+	rule__JvmWildcardTypeReference__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0()); }
+	()
+	{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmWildcardTypeReference__Group__1__Impl
+	rule__JvmWildcardTypeReference__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1()); }
+	'?'
+	{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmWildcardTypeReference__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getAlternatives_2()); }
+	(rule__JvmWildcardTypeReference__Alternatives_2)?
+	{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getAlternatives_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmWildcardTypeReference__Group_2_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmWildcardTypeReference__Group_2_0__0__Impl
+	rule__JvmWildcardTypeReference__Group_2_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group_2_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_0()); }
+	(rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0)
+	{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group_2_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmWildcardTypeReference__Group_2_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group_2_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_1()); }
+	(rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1)*
+	{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmWildcardTypeReference__Group_2_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmWildcardTypeReference__Group_2_1__0__Impl
+	rule__JvmWildcardTypeReference__Group_2_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group_2_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_0()); }
+	(rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0)
+	{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group_2_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmWildcardTypeReference__Group_2_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__Group_2_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_1()); }
+	(rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1)*
+	{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmUpperBound__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmUpperBound__Group__0__Impl
+	rule__JvmUpperBound__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBound__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0()); }
+	'extends'
+	{ after(grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBound__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmUpperBound__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBound__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceAssignment_1()); }
+	(rule__JvmUpperBound__TypeReferenceAssignment_1)
+	{ after(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmUpperBoundAnded__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmUpperBoundAnded__Group__0__Impl
+	rule__JvmUpperBoundAnded__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBoundAnded__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0()); }
+	'&'
+	{ after(grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBoundAnded__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmUpperBoundAnded__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBoundAnded__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceAssignment_1()); }
+	(rule__JvmUpperBoundAnded__TypeReferenceAssignment_1)
+	{ after(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmLowerBound__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmLowerBound__Group__0__Impl
+	rule__JvmLowerBound__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBound__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0()); }
+	'super'
+	{ after(grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBound__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmLowerBound__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBound__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceAssignment_1()); }
+	(rule__JvmLowerBound__TypeReferenceAssignment_1)
+	{ after(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__JvmLowerBoundAnded__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmLowerBoundAnded__Group__0__Impl
+	rule__JvmLowerBoundAnded__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBoundAnded__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0()); }
+	'&'
+	{ after(grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBoundAnded__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__JvmLowerBoundAnded__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBoundAnded__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceAssignment_1()); }
+	(rule__JvmLowerBoundAnded__TypeReferenceAssignment_1)
+	{ after(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__QualifiedNameWithWildcard__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedNameWithWildcard__Group__0__Impl
+	rule__QualifiedNameWithWildcard__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameWithWildcard__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0()); }
+	ruleQualifiedName
+	{ after(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameWithWildcard__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedNameWithWildcard__Group__1__Impl
+	rule__QualifiedNameWithWildcard__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameWithWildcard__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1()); }
+	'.'
+	{ after(grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameWithWildcard__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedNameWithWildcard__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameWithWildcard__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2()); }
+	'*'
+	{ after(grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__XImportDeclaration__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group__0__Impl
+	rule__XImportDeclaration__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getImportKeyword_0()); }
+	'import'
+	{ after(grammarAccess.getXImportDeclarationAccess().getImportKeyword_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group__1__Impl
+	rule__XImportDeclaration__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getAlternatives_1()); }
+	(rule__XImportDeclaration__Alternatives_1)
+	{ after(grammarAccess.getXImportDeclarationAccess().getAlternatives_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group__2__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_2()); }
+	(';')?
+	{ after(grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_2()); }
+)
+;
+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().getStaticAssignment_1_0_0()); }
+	(rule__XImportDeclaration__StaticAssignment_1_0_0)
+	{ after(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_1_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_1_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group_1_0__1__Impl
+	rule__XImportDeclaration__Group_1_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_1_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_1_0_1()); }
+	(rule__XImportDeclaration__ExtensionAssignment_1_0_1)?
+	{ after(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_1_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_1_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group_1_0__2__Impl
+	rule__XImportDeclaration__Group_1_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_1_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_0_2()); }
+	(rule__XImportDeclaration__ImportedTypeAssignment_1_0_2)
+	{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_1_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__XImportDeclaration__Group_1_0__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__Group_1_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getXImportDeclarationAccess().getAlternatives_1_0_3()); }
+	(rule__XImportDeclaration__Alternatives_1_0_3)
+	{ after(grammarAccess.getXImportDeclarationAccess().getAlternatives_1_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__QualifiedNameInStaticImport__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedNameInStaticImport__Group__0__Impl
+	rule__QualifiedNameInStaticImport__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameInStaticImport__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0()); }
+	ruleValidID
+	{ after(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameInStaticImport__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__QualifiedNameInStaticImport__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__QualifiedNameInStaticImport__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1()); }
+	'.'
+	{ after(grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__Source__IdAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSourceAccess().getIdQualifiedNameParserRuleCall_1_0()); }
+		ruleQualifiedName
+		{ after(grammarAccess.getSourceAccess().getIdQualifiedNameParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__RootTypeAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSourceAccess().getRootTypeJvmTypeReferenceParserRuleCall_3_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getSourceAccess().getRootTypeJvmTypeReferenceParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__InputsAssignment_7
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSourceAccess().getInputsInputParserRuleCall_7_0()); }
+		ruleInput
+		{ after(grammarAccess.getSourceAccess().getInputsInputParserRuleCall_7_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Source__PropertiesAssignment_9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getSourceAccess().getPropertiesPropertyParserRuleCall_9_0()); }
+		ruleProperty
+		{ after(grammarAccess.getSourceAccess().getPropertiesPropertyParserRuleCall_9_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__InputTypeAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInputAccess().getInputTypeJvmTypeReferenceParserRuleCall_1_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getInputAccess().getInputTypeJvmTypeReferenceParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__FiltersAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_3_0()); }
+		ruleEQFilter
+		{ after(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Input__FiltersAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_4_1_0()); }
+		ruleEQFilter
+		{ after(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EQFilter__RootTypePropertyPathAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEQFilterAccess().getRootTypePropertyPathNestedFieldParserRuleCall_2_0()); }
+		ruleNestedField
+		{ after(grammarAccess.getEQFilterAccess().getRootTypePropertyPathNestedFieldParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__EQFilter__InputTypePropertyPathAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getEQFilterAccess().getInputTypePropertyPathNestedFieldParserRuleCall_5_0()); }
+		ruleNestedField
+		{ after(grammarAccess.getEQFilterAccess().getInputTypePropertyPathNestedFieldParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Property__PathAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyAccess().getPathNestedFieldParserRuleCall_1_0()); }
+		ruleNestedField
+		{ after(grammarAccess.getPropertyAccess().getPathNestedFieldParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__Property__StyleAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyAccess().getStylePropertyStyleParserRuleCall_3_0()); }
+		rulePropertyStyle
+		{ after(grammarAccess.getPropertyAccess().getStylePropertyStyleParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedField__FieldAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNestedFieldAccess().getFieldJvmOperationCrossReference_1_0()); }
+		(
+			{ before(grammarAccess.getNestedFieldAccess().getFieldJvmOperationIDTerminalRuleCall_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getNestedFieldAccess().getFieldJvmOperationIDTerminalRuleCall_1_0_1()); }
+		)
+		{ after(grammarAccess.getNestedFieldAccess().getFieldJvmOperationCrossReference_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedField__PathAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNestedFieldAccess().getPathNestedPathParserRuleCall_2_0()); }
+		ruleNestedPath
+		{ after(grammarAccess.getNestedFieldAccess().getPathNestedPathParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedPath__FieldAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNestedPathAccess().getFieldJvmOperationCrossReference_2_0()); }
+		(
+			{ before(grammarAccess.getNestedPathAccess().getFieldJvmOperationIDTerminalRuleCall_2_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getNestedPathAccess().getFieldJvmOperationIDTerminalRuleCall_2_0_1()); }
+		)
+		{ after(grammarAccess.getNestedPathAccess().getFieldJvmOperationCrossReference_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NestedPath__PathAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNestedPathAccess().getPathNestedPathParserRuleCall_3_0()); }
+		ruleNestedPath
+		{ after(grammarAccess.getNestedPathAccess().getPathNestedPathParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyButtonStyle__EventTopicAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyButtonStyleAccess().getEventTopicSTRINGTerminalRuleCall_3_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getPropertyButtonStyleAccess().getEventTopicSTRINGTerminalRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyDateStyle__DateFormatAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyDateStyleAccess().getDateFormatSTRINGTerminalRuleCall_3_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getPropertyDateStyleAccess().getDateFormatSTRINGTerminalRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyNumberStyle__NumberFormatAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatSTRINGTerminalRuleCall_3_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatSTRINGTerminalRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyProgressbarStyle__MaxValueAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueLDoubleParserRuleCall_3_0()); }
+		ruleLDouble
+		{ after(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueLDoubleParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GridPropIndicatorStyle__GreenStartsAssignment_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsLDoubleParserRuleCall_3_0()); }
+		ruleLDouble
+		{ after(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsLDoubleParserRuleCall_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__GridPropIndicatorStyle__RedEndsAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsLDoubleParserRuleCall_5_0()); }
+		ruleLDouble
+		{ after(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsLDoubleParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__HtmlPatternAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0()); }
+		ruleNestedField
+		{ after(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyQuantityStyle__UomPropertyPathAssignment_9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathNestedFieldParserRuleCall_9_0()); }
+		ruleNestedField
+		{ after(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathNestedFieldParserRuleCall_9_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__HtmlPatternAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__ValuePropertyPathAssignment_5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0()); }
+		ruleNestedField
+		{ after(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathNestedFieldParserRuleCall_9_0()); }
+		ruleNestedField
+		{ after(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathNestedFieldParserRuleCall_9_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__EventTopicAssignment_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyImageStyleAccess().getEventTopicSTRINGTerminalRuleCall_2_1_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getPropertyImageStyleAccess().getEventTopicSTRINGTerminalRuleCall_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__PropertyImageStyle__ConfigsAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getPropertyImageStyleAccess().getConfigsStyleConfigParserRuleCall_4_0()); }
+		ruleStyleConfig
+		{ after(grammarAccess.getPropertyImageStyleAccess().getConfigsStyleConfigParserRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NumericToResourceStyleConfig__CompareAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0()); }
+		ruleStyleCompare
+		{ after(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NumericToResourceStyleConfig__ValueAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNumericToResourceStyleConfigAccess().getValueLDoubleParserRuleCall_2_0()); }
+		ruleLDouble
+		{ after(grammarAccess.getNumericToResourceStyleConfigAccess().getValueLDoubleParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0()); }
+		RULE_THEME_RESOURCE
+		{ after(grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringToResourceStyleConfig__CompareAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStringToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0()); }
+		ruleStyleCompare
+		{ after(grammarAccess.getStringToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringToResourceStyleConfig__ValueAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStringToResourceStyleConfigAccess().getValueSTRINGTerminalRuleCall_2_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getStringToResourceStyleConfigAccess().getValueSTRINGTerminalRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__StringToResourceStyleConfig__ResourceThemePathAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0()); }
+		RULE_THEME_RESOURCE
+		{ after(grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XFunctionTypeRef__ReturnTypeAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__TypeAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0()); }
+		(
+			{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeQualifiedNameParserRuleCall_0_0_1()); }
+			ruleQualifiedName
+			{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeQualifiedNameParserRuleCall_0_0_1()); }
+		)
+		{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); }
+		ruleJvmArgumentTypeReference
+		{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); }
+		ruleJvmArgumentTypeReference
+		{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0()); }
+		(
+			{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeValidIDParserRuleCall_1_4_1_0_1()); }
+			ruleValidID
+			{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeValidIDParserRuleCall_1_4_1_0_1()); }
+		)
+		{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0()); }
+		ruleJvmArgumentTypeReference
+		{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0()); }
+		ruleJvmArgumentTypeReference
+		{ after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0()); }
+		ruleJvmUpperBound
+		{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0()); }
+		ruleJvmUpperBoundAnded
+		{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0()); }
+		ruleJvmLowerBound
+		{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0()); }
+		ruleJvmLowerBoundAnded
+		{ after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBound__TypeReferenceAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmUpperBoundAnded__TypeReferenceAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBound__TypeReferenceAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__JvmLowerBoundAnded__TypeReferenceAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+		ruleJvmTypeReference
+		{ after(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__StaticAssignment_1_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_1_0_0_0()); }
+		(
+			{ before(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_1_0_0_0()); }
+			'static'
+			{ after(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_1_0_0_0()); }
+		)
+		{ after(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_1_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__ExtensionAssignment_1_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_1_0_1_0()); }
+		(
+			{ before(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_1_0_1_0()); }
+			'extension'
+			{ after(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_1_0_1_0()); }
+		)
+		{ after(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_1_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__ImportedTypeAssignment_1_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_0_2_0()); }
+		(
+			{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameInStaticImportParserRuleCall_1_0_2_0_1()); }
+			ruleQualifiedNameInStaticImport
+			{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameInStaticImportParserRuleCall_1_0_2_0_1()); }
+		)
+		{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__WildcardAssignment_1_0_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_1_0_3_0_0()); }
+		(
+			{ before(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_1_0_3_0_0()); }
+			'*'
+			{ after(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_1_0_3_0_0()); }
+		)
+		{ after(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_1_0_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__MemberNameAssignment_1_0_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_1_0_3_1_0()); }
+		ruleValidID
+		{ after(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_1_0_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__ImportedTypeAssignment_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_1_0()); }
+		(
+			{ before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameParserRuleCall_1_1_0_1()); }
+			ruleQualifiedName
+			{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameParserRuleCall_1_1_0_1()); }
+		)
+		{ after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__XImportDeclaration__ImportedNamespaceAssignment_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_2_0()); }
+		ruleQualifiedNameWithWildcard
+		{ after(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+RULE_ID : '^'? ('a'..'z'|'A'..'Z'|'$'|'_') ('a'..'z'|'A'..'Z'|'$'|'_'|'0'..'9')*;
+
+RULE_INT : '0'..'9' ('0'..'9'|'_')*;
+
+RULE_THEME_RESOURCE : 'theme:/' ('a'..'z'|'A'..'Z'|'$'|'_'|'.'|'/'|'0'..'9')*;
+
+RULE_EVENT_TOPIC : '\'' RULE_ID ('/' RULE_ID)* '/*'? '\'';
+
+RULE_STRING : ('"' ('\\' .|~(('\\'|'"')))* '"'?|'\'' ('\\' .|~(('\\'|'\'')))* '\''?);
+
+RULE_ML_COMMENT : '/*' ( options {greedy=false;} : . )*'*/';
+
+RULE_SL_COMMENT : '//' ~(('\n'|'\r'))* ('\r'? '\n')?;
+
+RULE_WS : (' '|'\t'|'\r'|'\n')+;
+
+RULE_ANY_OTHER : .;
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/internal/InternalGridSource.tokens b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/internal/InternalGridSource.tokens
new file mode 100644
index 0000000..8abefac
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/internal/InternalGridSource.tokens
@@ -0,0 +1,131 @@
+'&&'=28
+'&'=67
+'('=50
+')'=51
+'*'=69
+'+'=13
+','=62
+'-'=14
+'.'=34
+';'=71
+'<'=63
+'='=30
+'=>'=61
+'>'=64
+'?'=65
+'['=59
+']'=60
+'boolStyle'=38
+'buttonStyle'=35
+'currency'=53
+'dateStyle'=39
+'equal'=15
+'eventTopic'=36
+'extends'=66
+'extension'=73
+'filters'=27
+'for'=22
+'format'=40
+'greater equal'=16
+'greater than'=17
+'greenFrom'=45
+'gridsource'=21
+'htmlStyle'=37
+'imageStyle'=55
+'import'=70
+'indicatorStyle'=44
+'input:'=31
+'inputType'=26
+'inputs'=24
+'lower equal'=18
+'lower than'=19
+'max'=43
+'not equal'=20
+'number'=56
+'numberStyle'=41
+'priceStyle'=52
+'progressbarStyle'=42
+'prop'=32
+'quantityStyle'=47
+'redUntil'=46
+'root:'=29
+'static'=72
+'string'=58
+'style'=33
+'super'=68
+'textStyle'=54
+'then'=57
+'uom'=49
+'value'=48
+'{'=23
+'}'=25
+RULE_ANY_OTHER=12
+RULE_EVENT_TOPIC=8
+RULE_ID=4
+RULE_INT=5
+RULE_ML_COMMENT=9
+RULE_SL_COMMENT=10
+RULE_STRING=6
+RULE_THEME_RESOURCE=7
+RULE_WS=11
+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
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/internal/InternalGridSourceLexer.java b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/internal/InternalGridSourceLexer.java
new file mode 100644
index 0000000..0f05f33
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/internal/InternalGridSourceLexer.java
@@ -0,0 +1,3033 @@
+package org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.Lexer;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class InternalGridSourceLexer extends Lexer {
+    public static final int T__50=50;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__59=59;
+    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__55=55;
+    public static final int T__56=56;
+    public static final int T__13=13;
+    public static final int T__57=57;
+    public static final int T__14=14;
+    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 T__26=26;
+    public static final int T__27=27;
+    public static final int RULE_EVENT_TOPIC=8;
+    public static final int T__28=28;
+    public static final int RULE_INT=5;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__66=66;
+    public static final int RULE_ML_COMMENT=9;
+    public static final int T__23=23;
+    public static final int T__67=67;
+    public static final int T__24=24;
+    public static final int T__68=68;
+    public static final int T__25=25;
+    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__20=20;
+    public static final int T__64=64;
+    public static final int T__21=21;
+    public static final int T__65=65;
+    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=6;
+    public static final int RULE_SL_COMMENT=10;
+    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__73=73;
+    public static final int EOF=-1;
+    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 RULE_WS=11;
+    public static final int RULE_ANY_OTHER=12;
+    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 RULE_THEME_RESOURCE=7;
+    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;
+
+    // delegates
+    // delegators
+
+    public InternalGridSourceLexer() {;} 
+    public InternalGridSourceLexer(CharStream input) {
+        this(input, new RecognizerSharedState());
+    }
+    public InternalGridSourceLexer(CharStream input, RecognizerSharedState state) {
+        super(input,state);
+
+    }
+    public String getGrammarFileName() { return "InternalGridSource.g"; }
+
+    // $ANTLR start "T__13"
+    public final void mT__13() throws RecognitionException {
+        try {
+            int _type = T__13;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalGridSource.g:11:7: ( '+' )
+            // InternalGridSource.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;
+            // InternalGridSource.g:12:7: ( '-' )
+            // InternalGridSource.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;
+            // InternalGridSource.g:13:7: ( 'equal' )
+            // InternalGridSource.g:13:9: 'equal'
+            {
+            match("equal"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:14:7: ( 'greater equal' )
+            // InternalGridSource.g:14:9: 'greater equal'
+            {
+            match("greater equal"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:15:7: ( 'greater than' )
+            // InternalGridSource.g:15:9: 'greater than'
+            {
+            match("greater than"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:16:7: ( 'lower equal' )
+            // InternalGridSource.g:16:9: 'lower equal'
+            {
+            match("lower equal"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:17:7: ( 'lower than' )
+            // InternalGridSource.g:17:9: 'lower than'
+            {
+            match("lower than"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:18:7: ( 'not equal' )
+            // InternalGridSource.g:18:9: 'not equal'
+            {
+            match("not equal"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:19:7: ( 'gridsource' )
+            // InternalGridSource.g:19:9: 'gridsource'
+            {
+            match("gridsource"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:20:7: ( 'for' )
+            // InternalGridSource.g:20:9: 'for'
+            {
+            match("for"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:21:7: ( '{' )
+            // InternalGridSource.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;
+            // InternalGridSource.g:22:7: ( 'inputs' )
+            // InternalGridSource.g:22:9: 'inputs'
+            {
+            match("inputs"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:23:7: ( '}' )
+            // InternalGridSource.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;
+            // InternalGridSource.g:24:7: ( 'inputType' )
+            // InternalGridSource.g:24:9: 'inputType'
+            {
+            match("inputType"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:25:7: ( 'filters' )
+            // InternalGridSource.g:25:9: 'filters'
+            {
+            match("filters"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:26:7: ( '&&' )
+            // InternalGridSource.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;
+            // InternalGridSource.g:27:7: ( 'root:' )
+            // InternalGridSource.g:27:9: 'root:'
+            {
+            match("root:"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:28:7: ( '=' )
+            // InternalGridSource.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;
+            // InternalGridSource.g:29:7: ( 'input:' )
+            // InternalGridSource.g:29:9: 'input:'
+            {
+            match("input:"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:30:7: ( 'prop' )
+            // InternalGridSource.g:30:9: 'prop'
+            {
+            match("prop"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:31:7: ( 'style' )
+            // InternalGridSource.g:31:9: 'style'
+            {
+            match("style"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:32:7: ( '.' )
+            // InternalGridSource.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;
+            // InternalGridSource.g:33:7: ( 'buttonStyle' )
+            // InternalGridSource.g:33:9: 'buttonStyle'
+            {
+            match("buttonStyle"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:34:7: ( 'eventTopic' )
+            // InternalGridSource.g:34:9: 'eventTopic'
+            {
+            match("eventTopic"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:35:7: ( 'htmlStyle' )
+            // InternalGridSource.g:35:9: 'htmlStyle'
+            {
+            match("htmlStyle"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:36:7: ( 'boolStyle' )
+            // InternalGridSource.g:36:9: 'boolStyle'
+            {
+            match("boolStyle"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:37:7: ( 'dateStyle' )
+            // InternalGridSource.g:37:9: 'dateStyle'
+            {
+            match("dateStyle"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:38:7: ( 'format' )
+            // InternalGridSource.g:38:9: 'format'
+            {
+            match("format"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:39:7: ( 'numberStyle' )
+            // InternalGridSource.g:39:9: 'numberStyle'
+            {
+            match("numberStyle"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:40:7: ( 'progressbarStyle' )
+            // InternalGridSource.g:40:9: 'progressbarStyle'
+            {
+            match("progressbarStyle"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:41:7: ( 'max' )
+            // InternalGridSource.g:41:9: 'max'
+            {
+            match("max"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:42:7: ( 'indicatorStyle' )
+            // InternalGridSource.g:42:9: 'indicatorStyle'
+            {
+            match("indicatorStyle"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:43:7: ( 'greenFrom' )
+            // InternalGridSource.g:43:9: 'greenFrom'
+            {
+            match("greenFrom"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:44:7: ( 'redUntil' )
+            // InternalGridSource.g:44:9: 'redUntil'
+            {
+            match("redUntil"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:45:7: ( 'quantityStyle' )
+            // InternalGridSource.g:45:9: 'quantityStyle'
+            {
+            match("quantityStyle"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:46:7: ( 'value' )
+            // InternalGridSource.g:46:9: 'value'
+            {
+            match("value"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:47:7: ( 'uom' )
+            // InternalGridSource.g:47:9: 'uom'
+            {
+            match("uom"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:48:7: ( '(' )
+            // InternalGridSource.g:48:9: '('
+            {
+            match('('); 
+
+            }
+
+            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;
+            // InternalGridSource.g:49:7: ( ')' )
+            // InternalGridSource.g:49:9: ')'
+            {
+            match(')'); 
+
+            }
+
+            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;
+            // InternalGridSource.g:50:7: ( 'priceStyle' )
+            // InternalGridSource.g:50:9: 'priceStyle'
+            {
+            match("priceStyle"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:51:7: ( 'currency' )
+            // InternalGridSource.g:51:9: 'currency'
+            {
+            match("currency"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:52:7: ( 'textStyle' )
+            // InternalGridSource.g:52:9: 'textStyle'
+            {
+            match("textStyle"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:53:7: ( 'imageStyle' )
+            // InternalGridSource.g:53:9: 'imageStyle'
+            {
+            match("imageStyle"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:54:7: ( 'number' )
+            // InternalGridSource.g:54:9: 'number'
+            {
+            match("number"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:55:7: ( 'then' )
+            // InternalGridSource.g:55:9: 'then'
+            {
+            match("then"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:56:7: ( 'string' )
+            // InternalGridSource.g:56:9: 'string'
+            {
+            match("string"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:57:7: ( '[' )
+            // InternalGridSource.g:57:9: '['
+            {
+            match('['); 
+
+            }
+
+            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;
+            // InternalGridSource.g:58:7: ( ']' )
+            // InternalGridSource.g:58:9: ']'
+            {
+            match(']'); 
+
+            }
+
+            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;
+            // InternalGridSource.g:59:7: ( '=>' )
+            // InternalGridSource.g:59:9: '=>'
+            {
+            match("=>"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:60:7: ( ',' )
+            // InternalGridSource.g:60:9: ','
+            {
+            match(','); 
+
+            }
+
+            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;
+            // InternalGridSource.g:61:7: ( '<' )
+            // InternalGridSource.g:61:9: '<'
+            {
+            match('<'); 
+
+            }
+
+            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;
+            // InternalGridSource.g:62:7: ( '>' )
+            // InternalGridSource.g:62:9: '>'
+            {
+            match('>'); 
+
+            }
+
+            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;
+            // InternalGridSource.g:63:7: ( '?' )
+            // InternalGridSource.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;
+            // InternalGridSource.g:64:7: ( 'extends' )
+            // InternalGridSource.g:64:9: 'extends'
+            {
+            match("extends"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:65:7: ( '&' )
+            // InternalGridSource.g:65:9: '&'
+            {
+            match('&'); 
+
+            }
+
+            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;
+            // InternalGridSource.g:66:7: ( 'super' )
+            // InternalGridSource.g:66:9: 'super'
+            {
+            match("super"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:67:7: ( '*' )
+            // InternalGridSource.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;
+            // InternalGridSource.g:68:7: ( 'import' )
+            // InternalGridSource.g:68:9: 'import'
+            {
+            match("import"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:69:7: ( ';' )
+            // InternalGridSource.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;
+            // InternalGridSource.g:70:7: ( 'static' )
+            // InternalGridSource.g:70:9: 'static'
+            {
+            match("static"); 
+
+
+            }
+
+            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;
+            // InternalGridSource.g:71:7: ( 'extension' )
+            // InternalGridSource.g:71:9: 'extension'
+            {
+            match("extension"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__73"
+
+    // $ANTLR start "RULE_ID"
+    public final void mRULE_ID() throws RecognitionException {
+        try {
+            int _type = RULE_ID;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalGridSource.g:7218:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
+            // InternalGridSource.g:7218:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            {
+            // InternalGridSource.g:7218:11: ( '^' )?
+            int alt1=2;
+            int LA1_0 = input.LA(1);
+
+            if ( (LA1_0=='^') ) {
+                alt1=1;
+            }
+            switch (alt1) {
+                case 1 :
+                    // InternalGridSource.g:7218: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;}
+
+            // InternalGridSource.g:7218:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( (LA2_0=='$'||(LA2_0>='0' && LA2_0<='9')||(LA2_0>='A' && LA2_0<='Z')||LA2_0=='_'||(LA2_0>='a' && LA2_0<='z')) ) {
+                    alt2=1;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // InternalGridSource.g:
+            	    {
+            	    if ( input.LA(1)=='$'||(input.LA(1)>='0' && input.LA(1)<='9')||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+            	        input.consume();
+
+            	    }
+            	    else {
+            	        MismatchedSetException mse = new MismatchedSetException(null,input);
+            	        recover(mse);
+            	        throw mse;}
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop2;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ID"
+
+    // $ANTLR start "RULE_INT"
+    public final void mRULE_INT() throws RecognitionException {
+        try {
+            int _type = RULE_INT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalGridSource.g:7220:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
+            // InternalGridSource.g:7220:12: '0' .. '9' ( '0' .. '9' | '_' )*
+            {
+            matchRange('0','9'); 
+            // InternalGridSource.g:7220:21: ( '0' .. '9' | '_' )*
+            loop3:
+            do {
+                int alt3=2;
+                int LA3_0 = input.LA(1);
+
+                if ( ((LA3_0>='0' && LA3_0<='9')||LA3_0=='_') ) {
+                    alt3=1;
+                }
+
+
+                switch (alt3) {
+            	case 1 :
+            	    // InternalGridSource.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 loop3;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_INT"
+
+    // $ANTLR start "RULE_THEME_RESOURCE"
+    public final void mRULE_THEME_RESOURCE() throws RecognitionException {
+        try {
+            int _type = RULE_THEME_RESOURCE;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalGridSource.g:7222:21: ( 'theme:/' ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '.' | '/' | '0' .. '9' )* )
+            // InternalGridSource.g:7222:23: 'theme:/' ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '.' | '/' | '0' .. '9' )*
+            {
+            match("theme:/"); 
+
+            // InternalGridSource.g:7222:33: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '.' | '/' | '0' .. '9' )*
+            loop4:
+            do {
+                int alt4=2;
+                int LA4_0 = input.LA(1);
+
+                if ( (LA4_0=='$'||(LA4_0>='.' && LA4_0<='9')||(LA4_0>='A' && LA4_0<='Z')||LA4_0=='_'||(LA4_0>='a' && LA4_0<='z')) ) {
+                    alt4=1;
+                }
+
+
+                switch (alt4) {
+            	case 1 :
+            	    // InternalGridSource.g:
+            	    {
+            	    if ( input.LA(1)=='$'||(input.LA(1)>='.' && 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 loop4;
+                }
+            } while (true);
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_THEME_RESOURCE"
+
+    // $ANTLR start "RULE_EVENT_TOPIC"
+    public final void mRULE_EVENT_TOPIC() throws RecognitionException {
+        try {
+            int _type = RULE_EVENT_TOPIC;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalGridSource.g:7224:18: ( '\\'' RULE_ID ( '/' RULE_ID )* ( '/*' )? '\\'' )
+            // InternalGridSource.g:7224:20: '\\'' RULE_ID ( '/' RULE_ID )* ( '/*' )? '\\''
+            {
+            match('\''); 
+            mRULE_ID(); 
+            // InternalGridSource.g:7224:33: ( '/' RULE_ID )*
+            loop5:
+            do {
+                int alt5=2;
+                int LA5_0 = input.LA(1);
+
+                if ( (LA5_0=='/') ) {
+                    int LA5_1 = input.LA(2);
+
+                    if ( (LA5_1=='$'||(LA5_1>='A' && LA5_1<='Z')||(LA5_1>='^' && LA5_1<='_')||(LA5_1>='a' && LA5_1<='z')) ) {
+                        alt5=1;
+                    }
+
+
+                }
+
+
+                switch (alt5) {
+            	case 1 :
+            	    // InternalGridSource.g:7224:34: '/' RULE_ID
+            	    {
+            	    match('/'); 
+            	    mRULE_ID(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop5;
+                }
+            } while (true);
+
+            // InternalGridSource.g:7224:48: ( '/*' )?
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+
+            if ( (LA6_0=='/') ) {
+                alt6=1;
+            }
+            switch (alt6) {
+                case 1 :
+                    // InternalGridSource.g:7224:48: '/*'
+                    {
+                    match("/*"); 
+
+
+                    }
+                    break;
+
+            }
+
+            match('\''); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_EVENT_TOPIC"
+
+    // $ANTLR start "RULE_STRING"
+    public final void mRULE_STRING() throws RecognitionException {
+        try {
+            int _type = RULE_STRING;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalGridSource.g:7226:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
+            // InternalGridSource.g:7226:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            {
+            // InternalGridSource.g:7226:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            int alt11=2;
+            int LA11_0 = input.LA(1);
+
+            if ( (LA11_0=='\"') ) {
+                alt11=1;
+            }
+            else if ( (LA11_0=='\'') ) {
+                alt11=2;
+            }
+            else {
+                NoViableAltException nvae =
+                    new NoViableAltException("", 11, 0, input);
+
+                throw nvae;
+            }
+            switch (alt11) {
+                case 1 :
+                    // InternalGridSource.g:7226:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
+                    {
+                    match('\"'); 
+                    // InternalGridSource.g:7226:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    loop7:
+                    do {
+                        int alt7=3;
+                        int LA7_0 = input.LA(1);
+
+                        if ( (LA7_0=='\\') ) {
+                            alt7=1;
+                        }
+                        else if ( ((LA7_0>='\u0000' && LA7_0<='!')||(LA7_0>='#' && LA7_0<='[')||(LA7_0>=']' && LA7_0<='\uFFFF')) ) {
+                            alt7=2;
+                        }
+
+
+                        switch (alt7) {
+                    	case 1 :
+                    	    // InternalGridSource.g:7226:21: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalGridSource.g:7226: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 loop7;
+                        }
+                    } while (true);
+
+                    // InternalGridSource.g:7226:44: ( '\"' )?
+                    int alt8=2;
+                    int LA8_0 = input.LA(1);
+
+                    if ( (LA8_0=='\"') ) {
+                        alt8=1;
+                    }
+                    switch (alt8) {
+                        case 1 :
+                            // InternalGridSource.g:7226:44: '\"'
+                            {
+                            match('\"'); 
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalGridSource.g:7226:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
+                    {
+                    match('\''); 
+                    // InternalGridSource.g:7226:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    loop9:
+                    do {
+                        int alt9=3;
+                        int LA9_0 = input.LA(1);
+
+                        if ( (LA9_0=='\\') ) {
+                            alt9=1;
+                        }
+                        else if ( ((LA9_0>='\u0000' && LA9_0<='&')||(LA9_0>='(' && LA9_0<='[')||(LA9_0>=']' && LA9_0<='\uFFFF')) ) {
+                            alt9=2;
+                        }
+
+
+                        switch (alt9) {
+                    	case 1 :
+                    	    // InternalGridSource.g:7226:55: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // InternalGridSource.g:7226: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 loop9;
+                        }
+                    } while (true);
+
+                    // InternalGridSource.g:7226:79: ( '\\'' )?
+                    int alt10=2;
+                    int LA10_0 = input.LA(1);
+
+                    if ( (LA10_0=='\'') ) {
+                        alt10=1;
+                    }
+                    switch (alt10) {
+                        case 1 :
+                            // InternalGridSource.g:7226: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;
+            // InternalGridSource.g:7228:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalGridSource.g:7228:19: '/*' ( options {greedy=false; } : . )* '*/'
+            {
+            match("/*"); 
+
+            // InternalGridSource.g:7228:24: ( options {greedy=false; } : . )*
+            loop12:
+            do {
+                int alt12=2;
+                int LA12_0 = input.LA(1);
+
+                if ( (LA12_0=='*') ) {
+                    int LA12_1 = input.LA(2);
+
+                    if ( (LA12_1=='/') ) {
+                        alt12=2;
+                    }
+                    else if ( ((LA12_1>='\u0000' && LA12_1<='.')||(LA12_1>='0' && LA12_1<='\uFFFF')) ) {
+                        alt12=1;
+                    }
+
+
+                }
+                else if ( ((LA12_0>='\u0000' && LA12_0<=')')||(LA12_0>='+' && LA12_0<='\uFFFF')) ) {
+                    alt12=1;
+                }
+
+
+                switch (alt12) {
+            	case 1 :
+            	    // InternalGridSource.g:7228:52: .
+            	    {
+            	    matchAny(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop12;
+                }
+            } 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;
+            // InternalGridSource.g:7230:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalGridSource.g:7230:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            {
+            match("//"); 
+
+            // InternalGridSource.g:7230:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            loop13:
+            do {
+                int alt13=2;
+                int LA13_0 = input.LA(1);
+
+                if ( ((LA13_0>='\u0000' && LA13_0<='\t')||(LA13_0>='\u000B' && LA13_0<='\f')||(LA13_0>='\u000E' && LA13_0<='\uFFFF')) ) {
+                    alt13=1;
+                }
+
+
+                switch (alt13) {
+            	case 1 :
+            	    // InternalGridSource.g:7230: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 loop13;
+                }
+            } while (true);
+
+            // InternalGridSource.g:7230:40: ( ( '\\r' )? '\\n' )?
+            int alt15=2;
+            int LA15_0 = input.LA(1);
+
+            if ( (LA15_0=='\n'||LA15_0=='\r') ) {
+                alt15=1;
+            }
+            switch (alt15) {
+                case 1 :
+                    // InternalGridSource.g:7230:41: ( '\\r' )? '\\n'
+                    {
+                    // InternalGridSource.g:7230:41: ( '\\r' )?
+                    int alt14=2;
+                    int LA14_0 = input.LA(1);
+
+                    if ( (LA14_0=='\r') ) {
+                        alt14=1;
+                    }
+                    switch (alt14) {
+                        case 1 :
+                            // InternalGridSource.g:7230: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;
+            // InternalGridSource.g:7232:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalGridSource.g:7232:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            {
+            // InternalGridSource.g:7232:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            int cnt16=0;
+            loop16:
+            do {
+                int alt16=2;
+                int LA16_0 = input.LA(1);
+
+                if ( ((LA16_0>='\t' && LA16_0<='\n')||LA16_0=='\r'||LA16_0==' ') ) {
+                    alt16=1;
+                }
+
+
+                switch (alt16) {
+            	case 1 :
+            	    // InternalGridSource.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 ( cnt16 >= 1 ) break loop16;
+                        EarlyExitException eee =
+                            new EarlyExitException(16, input);
+                        throw eee;
+                }
+                cnt16++;
+            } 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;
+            // InternalGridSource.g:7234:16: ( . )
+            // InternalGridSource.g:7234:18: .
+            {
+            matchAny(); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ANY_OTHER"
+
+    public void mTokens() throws RecognitionException {
+        // InternalGridSource.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 | RULE_ID | RULE_INT | RULE_THEME_RESOURCE | RULE_EVENT_TOPIC | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        int alt17=70;
+        alt17 = dfa17.predict(input);
+        switch (alt17) {
+            case 1 :
+                // InternalGridSource.g:1:10: T__13
+                {
+                mT__13(); 
+
+                }
+                break;
+            case 2 :
+                // InternalGridSource.g:1:16: T__14
+                {
+                mT__14(); 
+
+                }
+                break;
+            case 3 :
+                // InternalGridSource.g:1:22: T__15
+                {
+                mT__15(); 
+
+                }
+                break;
+            case 4 :
+                // InternalGridSource.g:1:28: T__16
+                {
+                mT__16(); 
+
+                }
+                break;
+            case 5 :
+                // InternalGridSource.g:1:34: T__17
+                {
+                mT__17(); 
+
+                }
+                break;
+            case 6 :
+                // InternalGridSource.g:1:40: T__18
+                {
+                mT__18(); 
+
+                }
+                break;
+            case 7 :
+                // InternalGridSource.g:1:46: T__19
+                {
+                mT__19(); 
+
+                }
+                break;
+            case 8 :
+                // InternalGridSource.g:1:52: T__20
+                {
+                mT__20(); 
+
+                }
+                break;
+            case 9 :
+                // InternalGridSource.g:1:58: T__21
+                {
+                mT__21(); 
+
+                }
+                break;
+            case 10 :
+                // InternalGridSource.g:1:64: T__22
+                {
+                mT__22(); 
+
+                }
+                break;
+            case 11 :
+                // InternalGridSource.g:1:70: T__23
+                {
+                mT__23(); 
+
+                }
+                break;
+            case 12 :
+                // InternalGridSource.g:1:76: T__24
+                {
+                mT__24(); 
+
+                }
+                break;
+            case 13 :
+                // InternalGridSource.g:1:82: T__25
+                {
+                mT__25(); 
+
+                }
+                break;
+            case 14 :
+                // InternalGridSource.g:1:88: T__26
+                {
+                mT__26(); 
+
+                }
+                break;
+            case 15 :
+                // InternalGridSource.g:1:94: T__27
+                {
+                mT__27(); 
+
+                }
+                break;
+            case 16 :
+                // InternalGridSource.g:1:100: T__28
+                {
+                mT__28(); 
+
+                }
+                break;
+            case 17 :
+                // InternalGridSource.g:1:106: T__29
+                {
+                mT__29(); 
+
+                }
+                break;
+            case 18 :
+                // InternalGridSource.g:1:112: T__30
+                {
+                mT__30(); 
+
+                }
+                break;
+            case 19 :
+                // InternalGridSource.g:1:118: T__31
+                {
+                mT__31(); 
+
+                }
+                break;
+            case 20 :
+                // InternalGridSource.g:1:124: T__32
+                {
+                mT__32(); 
+
+                }
+                break;
+            case 21 :
+                // InternalGridSource.g:1:130: T__33
+                {
+                mT__33(); 
+
+                }
+                break;
+            case 22 :
+                // InternalGridSource.g:1:136: T__34
+                {
+                mT__34(); 
+
+                }
+                break;
+            case 23 :
+                // InternalGridSource.g:1:142: T__35
+                {
+                mT__35(); 
+
+                }
+                break;
+            case 24 :
+                // InternalGridSource.g:1:148: T__36
+                {
+                mT__36(); 
+
+                }
+                break;
+            case 25 :
+                // InternalGridSource.g:1:154: T__37
+                {
+                mT__37(); 
+
+                }
+                break;
+            case 26 :
+                // InternalGridSource.g:1:160: T__38
+                {
+                mT__38(); 
+
+                }
+                break;
+            case 27 :
+                // InternalGridSource.g:1:166: T__39
+                {
+                mT__39(); 
+
+                }
+                break;
+            case 28 :
+                // InternalGridSource.g:1:172: T__40
+                {
+                mT__40(); 
+
+                }
+                break;
+            case 29 :
+                // InternalGridSource.g:1:178: T__41
+                {
+                mT__41(); 
+
+                }
+                break;
+            case 30 :
+                // InternalGridSource.g:1:184: T__42
+                {
+                mT__42(); 
+
+                }
+                break;
+            case 31 :
+                // InternalGridSource.g:1:190: T__43
+                {
+                mT__43(); 
+
+                }
+                break;
+            case 32 :
+                // InternalGridSource.g:1:196: T__44
+                {
+                mT__44(); 
+
+                }
+                break;
+            case 33 :
+                // InternalGridSource.g:1:202: T__45
+                {
+                mT__45(); 
+
+                }
+                break;
+            case 34 :
+                // InternalGridSource.g:1:208: T__46
+                {
+                mT__46(); 
+
+                }
+                break;
+            case 35 :
+                // InternalGridSource.g:1:214: T__47
+                {
+                mT__47(); 
+
+                }
+                break;
+            case 36 :
+                // InternalGridSource.g:1:220: T__48
+                {
+                mT__48(); 
+
+                }
+                break;
+            case 37 :
+                // InternalGridSource.g:1:226: T__49
+                {
+                mT__49(); 
+
+                }
+                break;
+            case 38 :
+                // InternalGridSource.g:1:232: T__50
+                {
+                mT__50(); 
+
+                }
+                break;
+            case 39 :
+                // InternalGridSource.g:1:238: T__51
+                {
+                mT__51(); 
+
+                }
+                break;
+            case 40 :
+                // InternalGridSource.g:1:244: T__52
+                {
+                mT__52(); 
+
+                }
+                break;
+            case 41 :
+                // InternalGridSource.g:1:250: T__53
+                {
+                mT__53(); 
+
+                }
+                break;
+            case 42 :
+                // InternalGridSource.g:1:256: T__54
+                {
+                mT__54(); 
+
+                }
+                break;
+            case 43 :
+                // InternalGridSource.g:1:262: T__55
+                {
+                mT__55(); 
+
+                }
+                break;
+            case 44 :
+                // InternalGridSource.g:1:268: T__56
+                {
+                mT__56(); 
+
+                }
+                break;
+            case 45 :
+                // InternalGridSource.g:1:274: T__57
+                {
+                mT__57(); 
+
+                }
+                break;
+            case 46 :
+                // InternalGridSource.g:1:280: T__58
+                {
+                mT__58(); 
+
+                }
+                break;
+            case 47 :
+                // InternalGridSource.g:1:286: T__59
+                {
+                mT__59(); 
+
+                }
+                break;
+            case 48 :
+                // InternalGridSource.g:1:292: T__60
+                {
+                mT__60(); 
+
+                }
+                break;
+            case 49 :
+                // InternalGridSource.g:1:298: T__61
+                {
+                mT__61(); 
+
+                }
+                break;
+            case 50 :
+                // InternalGridSource.g:1:304: T__62
+                {
+                mT__62(); 
+
+                }
+                break;
+            case 51 :
+                // InternalGridSource.g:1:310: T__63
+                {
+                mT__63(); 
+
+                }
+                break;
+            case 52 :
+                // InternalGridSource.g:1:316: T__64
+                {
+                mT__64(); 
+
+                }
+                break;
+            case 53 :
+                // InternalGridSource.g:1:322: T__65
+                {
+                mT__65(); 
+
+                }
+                break;
+            case 54 :
+                // InternalGridSource.g:1:328: T__66
+                {
+                mT__66(); 
+
+                }
+                break;
+            case 55 :
+                // InternalGridSource.g:1:334: T__67
+                {
+                mT__67(); 
+
+                }
+                break;
+            case 56 :
+                // InternalGridSource.g:1:340: T__68
+                {
+                mT__68(); 
+
+                }
+                break;
+            case 57 :
+                // InternalGridSource.g:1:346: T__69
+                {
+                mT__69(); 
+
+                }
+                break;
+            case 58 :
+                // InternalGridSource.g:1:352: T__70
+                {
+                mT__70(); 
+
+                }
+                break;
+            case 59 :
+                // InternalGridSource.g:1:358: T__71
+                {
+                mT__71(); 
+
+                }
+                break;
+            case 60 :
+                // InternalGridSource.g:1:364: T__72
+                {
+                mT__72(); 
+
+                }
+                break;
+            case 61 :
+                // InternalGridSource.g:1:370: T__73
+                {
+                mT__73(); 
+
+                }
+                break;
+            case 62 :
+                // InternalGridSource.g:1:376: RULE_ID
+                {
+                mRULE_ID(); 
+
+                }
+                break;
+            case 63 :
+                // InternalGridSource.g:1:384: RULE_INT
+                {
+                mRULE_INT(); 
+
+                }
+                break;
+            case 64 :
+                // InternalGridSource.g:1:393: RULE_THEME_RESOURCE
+                {
+                mRULE_THEME_RESOURCE(); 
+
+                }
+                break;
+            case 65 :
+                // InternalGridSource.g:1:413: RULE_EVENT_TOPIC
+                {
+                mRULE_EVENT_TOPIC(); 
+
+                }
+                break;
+            case 66 :
+                // InternalGridSource.g:1:430: RULE_STRING
+                {
+                mRULE_STRING(); 
+
+                }
+                break;
+            case 67 :
+                // InternalGridSource.g:1:442: RULE_ML_COMMENT
+                {
+                mRULE_ML_COMMENT(); 
+
+                }
+                break;
+            case 68 :
+                // InternalGridSource.g:1:458: RULE_SL_COMMENT
+                {
+                mRULE_SL_COMMENT(); 
+
+                }
+                break;
+            case 69 :
+                // InternalGridSource.g:1:474: RULE_WS
+                {
+                mRULE_WS(); 
+
+                }
+                break;
+            case 70 :
+                // InternalGridSource.g:1:482: RULE_ANY_OTHER
+                {
+                mRULE_ANY_OTHER(); 
+
+                }
+                break;
+
+        }
+
+    }
+
+
+    protected DFA17 dfa17 = new DFA17(this);
+    static final String DFA17_eotS =
+        "\3\uffff\5\61\1\uffff\1\61\1\uffff\1\75\1\61\1\101\2\61\1\uffff\7\61\2\uffff\2\61\10\uffff\1\53\2\uffff\1\134\1\uffff\1\53\4\uffff\3\61\1\uffff\6\61\1\uffff\2\61\3\uffff\2\61\2\uffff\3\61\1\uffff\10\61\2\uffff\3\61\12\uffff\2\134\3\uffff\10\61\1\u0090\21\61\1\u00a3\2\61\1\u00a6\3\61\2\134\1\uffff\7\61\1\uffff\2\61\1\uffff\7\61\1\u00bf\12\61\1\uffff\2\61\1\uffff\2\61\1\u00ce\1\61\3\134\1\uffff\1\u00d1\15\61\1\uffff\1\61\1\uffff\2\61\1\u00e5\2\61\1\u00e8\5\61\1\u00ee\2\61\1\uffff\1\61\1\134\1\uffff\6\61\1\uffff\1\u00fb\1\u00fc\1\61\1\u00fe\1\61\1\uffff\2\61\1\u0102\3\61\1\uffff\1\u0106\1\u0107\1\uffff\5\61\1\uffff\2\61\1\uffff\1\61\1\u0110\4\61\2\uffff\1\61\2\uffff\1\u0116\1\uffff\3\61\1\uffff\3\61\2\uffff\10\61\1\uffff\1\61\1\uffff\3\61\1\uffff\3\61\1\u012e\7\61\1\u0136\2\61\1\u0139\2\uffff\1\u013a\2\61\1\u013d\2\61\1\uffff\3\61\1\u0143\1\u0144\1\u0145\1\61\1\uffff\1\u0147\1\u0148\2\uffff\1\u0149\1\61\1\uffff\1\61\1\u014c\1\61\1\u014e\1\61\3\uffff\1\61\3\uffff\1\u0151\1\61\1\uffff\1\61\1\uffff\1\u0154\1\61\1\uffff\2\61\1\uffff\3\61\1\u015b\1\u015c\1\61\2\uffff\1\61\1\u015f\1\uffff";
+    static final String DFA17_eofS =
+        "\u0160\uffff";
+    static final String DFA17_minS =
+        "\1\0\2\uffff\1\161\1\162\2\157\1\151\1\uffff\1\155\1\uffff\1\46\1\145\1\76\1\162\1\164\1\uffff\1\157\1\164\2\141\1\165\1\141\1\157\2\uffff\1\165\1\145\10\uffff\1\44\2\uffff\1\44\1\uffff\1\52\4\uffff\1\165\1\145\1\164\1\uffff\1\145\1\167\1\164\1\155\1\162\1\154\1\uffff\1\144\1\141\3\uffff\1\157\1\144\2\uffff\1\151\1\141\1\160\1\uffff\1\164\1\157\1\155\1\164\1\170\1\141\1\154\1\155\2\uffff\1\162\1\170\1\145\12\uffff\2\44\3\uffff\1\141\1\156\1\145\1\141\1\144\1\145\1\40\1\142\1\44\1\164\1\165\1\151\1\147\1\157\1\164\1\125\1\147\1\143\1\154\1\151\1\164\1\145\1\164\2\154\1\145\1\44\1\156\1\165\1\44\1\162\1\164\1\155\2\44\1\uffff\1\154\1\164\1\156\1\164\1\156\1\163\1\162\1\uffff\1\145\1\141\1\uffff\1\145\1\164\1\143\1\145\1\162\1\72\1\156\1\44\1\162\2\145\1\156\1\151\1\162\1\157\3\123\1\uffff\1\164\1\145\1\uffff\1\145\1\123\1\44\1\145\1\47\2\44\1\uffff\1\44\1\124\1\144\1\145\1\106\1\157\1\40\1\162\1\164\1\162\1\72\1\141\1\123\1\164\1\uffff\1\164\1\uffff\1\145\1\123\1\44\1\147\1\143\1\44\1\156\3\164\1\151\1\44\1\156\1\164\1\uffff\1\72\1\44\1\uffff\1\157\1\163\1\151\2\162\1\165\1\145\2\44\1\163\1\44\1\171\1\uffff\2\164\1\44\1\151\1\163\1\164\1\uffff\2\44\1\uffff\1\123\3\171\1\164\1\uffff\1\143\1\171\1\uffff\1\160\1\44\1\157\1\40\1\157\1\162\2\uffff\1\164\2\uffff\1\44\1\uffff\1\160\1\157\1\171\1\uffff\1\154\1\163\1\171\2\uffff\1\164\3\154\2\171\1\154\1\151\1\uffff\1\156\1\145\1\155\1\143\1\171\1\uffff\1\145\1\162\1\154\1\44\1\142\1\154\1\171\3\145\1\123\1\44\1\145\1\143\1\44\2\uffff\1\44\1\145\1\154\1\44\1\123\1\145\1\uffff\1\141\1\145\1\154\3\44\1\164\1\uffff\2\44\2\uffff\1\44\1\145\1\uffff\1\164\1\44\1\162\1\44\1\145\3\uffff\1\171\3\uffff\1\44\1\171\1\uffff\1\123\1\uffff\1\44\1\154\1\uffff\1\154\1\164\1\uffff\2\145\1\171\2\44\1\154\2\uffff\1\145\1\44\1\uffff";
+    static final String DFA17_maxS =
+        "\1\uffff\2\uffff\1\170\1\162\1\157\1\165\1\157\1\uffff\1\156\1\uffff\1\46\1\157\1\76\1\162\1\165\1\uffff\1\165\1\164\2\141\1\165\1\141\1\157\2\uffff\1\165\1\150\10\uffff\1\172\2\uffff\1\172\1\uffff\1\57\4\uffff\1\165\1\145\1\164\1\uffff\1\151\1\167\1\164\1\155\1\162\1\154\1\uffff\2\160\3\uffff\1\157\1\144\2\uffff\1\157\1\171\1\160\1\uffff\1\164\1\157\1\155\1\164\1\170\1\141\1\154\1\155\2\uffff\1\162\1\170\1\145\12\uffff\2\172\3\uffff\1\141\1\156\2\145\1\144\1\145\1\40\1\142\1\172\1\164\1\165\1\151\1\147\1\157\1\164\1\125\1\160\1\143\1\154\1\151\1\164\1\145\1\164\2\154\1\145\1\172\1\156\1\165\1\172\1\162\1\164\1\156\2\172\1\uffff\1\154\1\164\1\156\1\164\1\156\1\163\1\162\1\uffff\1\145\1\141\1\uffff\1\145\1\164\1\143\1\145\1\162\1\72\1\156\1\172\1\162\2\145\1\156\1\151\1\162\1\157\3\123\1\uffff\1\164\1\145\1\uffff\1\145\1\123\1\172\1\145\1\47\2\172\1\uffff\1\172\1\124\1\163\1\145\1\106\1\157\1\40\1\162\1\164\1\162\1\163\1\141\1\123\1\164\1\uffff\1\164\1\uffff\1\145\1\123\1\172\1\147\1\143\1\172\1\156\3\164\1\151\1\172\1\156\1\164\1\uffff\1\72\1\172\1\uffff\1\157\1\163\1\151\2\162\1\165\1\164\2\172\1\163\1\172\1\171\1\uffff\2\164\1\172\1\151\1\163\1\164\1\uffff\2\172\1\uffff\1\123\3\171\1\164\1\uffff\1\143\1\171\1\uffff\1\160\1\172\1\157\1\40\1\157\1\162\2\uffff\1\164\2\uffff\1\172\1\uffff\1\160\1\157\1\171\1\uffff\1\154\1\163\1\171\2\uffff\1\164\3\154\2\171\1\154\1\151\1\uffff\1\156\1\164\1\155\1\143\1\171\1\uffff\1\145\1\162\1\154\1\172\1\142\1\154\1\171\3\145\1\123\1\172\1\145\1\143\1\172\2\uffff\1\172\1\145\1\154\1\172\1\123\1\145\1\uffff\1\141\1\145\1\154\3\172\1\164\1\uffff\2\172\2\uffff\1\172\1\145\1\uffff\1\164\1\172\1\162\1\172\1\145\3\uffff\1\171\3\uffff\1\172\1\171\1\uffff\1\123\1\uffff\1\172\1\154\1\uffff\1\154\1\164\1\uffff\2\145\1\171\2\172\1\154\2\uffff\1\145\1\172\1\uffff";
+    static final String DFA17_acceptS =
+        "\1\uffff\1\1\1\2\5\uffff\1\13\1\uffff\1\15\5\uffff\1\26\7\uffff\1\46\1\47\2\uffff\1\57\1\60\1\62\1\63\1\64\1\65\1\71\1\73\1\uffff\1\76\1\77\1\uffff\1\102\1\uffff\1\105\1\106\1\1\1\2\3\uffff\1\76\6\uffff\1\13\2\uffff\1\15\1\20\1\67\2\uffff\1\61\1\22\3\uffff\1\26\10\uffff\1\46\1\47\3\uffff\1\57\1\60\1\62\1\63\1\64\1\65\1\71\1\73\1\77\1\102\2\uffff\1\103\1\104\1\105\43\uffff\1\101\7\uffff\1\10\2\uffff\1\12\22\uffff\1\37\2\uffff\1\45\7\uffff\1\101\16\uffff\1\21\1\uffff\1\24\16\uffff\1\55\2\uffff\1\3\14\uffff\1\23\6\uffff\1\25\2\uffff\1\70\5\uffff\1\44\2\uffff\1\100\6\uffff\1\6\1\7\1\uffff\1\54\1\34\1\uffff\1\14\3\uffff\1\72\3\uffff\1\56\1\74\10\uffff\1\66\5\uffff\1\17\17\uffff\1\4\1\5\6\uffff\1\42\7\uffff\1\51\2\uffff\1\75\1\41\2\uffff\1\16\5\uffff\1\32\1\31\1\33\1\uffff\1\52\1\30\1\11\2\uffff\1\53\1\uffff\1\50\2\uffff\1\35\2\uffff\1\27\6\uffff\1\43\1\40\2\uffff\1\36";
+    static final String DFA17_specialS =
+        "\1\0\u015f\uffff}>";
+    static final String[] DFA17_transitionS = {
+            "\11\53\2\52\2\53\1\52\22\53\1\52\1\53\1\50\1\53\1\45\1\53\1\13\1\47\1\30\1\31\1\42\1\1\1\36\1\2\1\20\1\51\12\46\1\53\1\43\1\37\1\15\1\40\1\41\1\53\32\45\1\34\1\53\1\35\1\44\1\45\1\53\1\45\1\21\1\32\1\23\1\3\1\7\1\4\1\22\1\11\2\45\1\5\1\24\1\6\1\45\1\16\1\25\1\14\1\17\1\33\1\27\1\26\4\45\1\10\1\53\1\12\uff82\53",
+            "",
+            "",
+            "\1\56\4\uffff\1\57\1\uffff\1\60",
+            "\1\62",
+            "\1\63",
+            "\1\64\5\uffff\1\65",
+            "\1\67\5\uffff\1\66",
+            "",
+            "\1\72\1\71",
+            "",
+            "\1\74",
+            "\1\77\11\uffff\1\76",
+            "\1\100",
+            "\1\102",
+            "\1\103\1\104",
+            "",
+            "\1\107\5\uffff\1\106",
+            "\1\110",
+            "\1\111",
+            "\1\112",
+            "\1\113",
+            "\1\114",
+            "\1\115",
+            "",
+            "",
+            "\1\120",
+            "\1\121\2\uffff\1\122",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\61\34\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "",
+            "",
+            "\1\136\34\uffff\32\136\3\uffff\1\135\1\136\1\uffff\32\136",
+            "",
+            "\1\137\4\uffff\1\140",
+            "",
+            "",
+            "",
+            "",
+            "\1\142",
+            "\1\143",
+            "\1\144",
+            "",
+            "\1\145\3\uffff\1\146",
+            "\1\147",
+            "\1\150",
+            "\1\151",
+            "\1\152",
+            "\1\153",
+            "",
+            "\1\155\13\uffff\1\154",
+            "\1\156\16\uffff\1\157",
+            "",
+            "",
+            "",
+            "\1\160",
+            "\1\161",
+            "",
+            "",
+            "\1\163\5\uffff\1\162",
+            "\1\166\20\uffff\1\165\6\uffff\1\164",
+            "\1\167",
+            "",
+            "\1\170",
+            "\1\171",
+            "\1\172",
+            "\1\173",
+            "\1\174",
+            "\1\175",
+            "\1\176",
+            "\1\177",
+            "",
+            "",
+            "\1\u0080",
+            "\1\u0081",
+            "\1\u0082",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\136\34\uffff\32\136\4\uffff\1\136\1\uffff\32\136",
+            "\1\u0083\2\uffff\1\u0085\7\uffff\1\u0084\12\u0083\7\uffff\32\u0083\4\uffff\1\u0083\1\uffff\32\u0083",
+            "",
+            "",
+            "",
+            "\1\u0086",
+            "\1\u0087",
+            "\1\u0088",
+            "\1\u0089\3\uffff\1\u008a",
+            "\1\u008b",
+            "\1\u008c",
+            "\1\u008d",
+            "\1\u008e",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\14\61\1\u008f\15\61",
+            "\1\u0091",
+            "\1\u0092",
+            "\1\u0093",
+            "\1\u0094",
+            "\1\u0095",
+            "\1\u0096",
+            "\1\u0097",
+            "\1\u0099\10\uffff\1\u0098",
+            "\1\u009a",
+            "\1\u009b",
+            "\1\u009c",
+            "\1\u009d",
+            "\1\u009e",
+            "\1\u009f",
+            "\1\u00a0",
+            "\1\u00a1",
+            "\1\u00a2",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u00a4",
+            "\1\u00a5",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u00a7",
+            "\1\u00a8",
+            "\1\u00aa\1\u00a9",
+            "\1\u0083\2\uffff\1\u0085\7\uffff\1\u0084\12\u0083\7\uffff\32\u0083\4\uffff\1\u0083\1\uffff\32\u0083",
+            "\1\u00ad\5\uffff\1\u00ab\26\uffff\32\u00ad\3\uffff\1\u00ac\1\u00ad\1\uffff\32\u00ad",
+            "",
+            "\1\u00af",
+            "\1\u00b0",
+            "\1\u00b1",
+            "\1\u00b2",
+            "\1\u00b3",
+            "\1\u00b4",
+            "\1\u00b5",
+            "",
+            "\1\u00b6",
+            "\1\u00b7",
+            "",
+            "\1\u00b8",
+            "\1\u00b9",
+            "\1\u00ba",
+            "\1\u00bb",
+            "\1\u00bc",
+            "\1\u00bd",
+            "\1\u00be",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u00c0",
+            "\1\u00c1",
+            "\1\u00c2",
+            "\1\u00c3",
+            "\1\u00c4",
+            "\1\u00c5",
+            "\1\u00c6",
+            "\1\u00c7",
+            "\1\u00c8",
+            "\1\u00c9",
+            "",
+            "\1\u00ca",
+            "\1\u00cb",
+            "",
+            "\1\u00cc",
+            "\1\u00cd",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u00cf",
+            "\1\u0085",
+            "\1\u00ad\34\uffff\32\u00ad\4\uffff\1\u00ad\1\uffff\32\u00ad",
+            "\1\u00d0\2\uffff\1\u0085\7\uffff\1\u0084\12\u00d0\7\uffff\32\u00d0\4\uffff\1\u00d0\1\uffff\32\u00d0",
+            "",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u00d2",
+            "\1\u00d3\16\uffff\1\u00d4",
+            "\1\u00d5",
+            "\1\u00d6",
+            "\1\u00d7",
+            "\1\u00d8",
+            "\1\u00d9",
+            "\1\u00da",
+            "\1\u00db",
+            "\1\u00de\31\uffff\1\u00dd\36\uffff\1\u00dc",
+            "\1\u00df",
+            "\1\u00e0",
+            "\1\u00e1",
+            "",
+            "\1\u00e2",
+            "",
+            "\1\u00e3",
+            "\1\u00e4",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u00e6",
+            "\1\u00e7",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u00e9",
+            "\1\u00ea",
+            "\1\u00eb",
+            "\1\u00ec",
+            "\1\u00ed",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u00ef",
+            "\1\u00f0",
+            "",
+            "\1\u00f1",
+            "\1\u00d0\2\uffff\1\u0085\7\uffff\1\u0084\12\u00d0\7\uffff\32\u00d0\4\uffff\1\u00d0\1\uffff\32\u00d0",
+            "",
+            "\1\u00f2",
+            "\1\u00f3",
+            "\1\u00f4",
+            "\1\u00f5",
+            "\1\u00f6",
+            "\1\u00f7",
+            "\1\u00f8\16\uffff\1\u00f9",
+            "\1\61\13\uffff\12\61\7\uffff\22\61\1\u00fa\7\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u00fd",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u00ff",
+            "",
+            "\1\u0100",
+            "\1\u0101",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u0103",
+            "\1\u0104",
+            "\1\u0105",
+            "",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "",
+            "\1\u0108",
+            "\1\u0109",
+            "\1\u010a",
+            "\1\u010b",
+            "\1\u010c",
+            "",
+            "\1\u010d",
+            "\1\u010e",
+            "",
+            "\1\u010f",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u0111",
+            "\1\u0112",
+            "\1\u0113",
+            "\1\u0114",
+            "",
+            "",
+            "\1\u0115",
+            "",
+            "",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "",
+            "\1\u0117",
+            "\1\u0118",
+            "\1\u0119",
+            "",
+            "\1\u011a",
+            "\1\u011b",
+            "\1\u011c",
+            "",
+            "",
+            "\1\u011d",
+            "\1\u011e",
+            "\1\u011f",
+            "\1\u0120",
+            "\1\u0121",
+            "\1\u0122",
+            "\1\u0123",
+            "\1\u0124",
+            "",
+            "\1\u0125",
+            "\1\u0126\16\uffff\1\u0127",
+            "\1\u0128",
+            "\1\u0129",
+            "\1\u012a",
+            "",
+            "\1\u012b",
+            "\1\u012c",
+            "\1\u012d",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u012f",
+            "\1\u0130",
+            "\1\u0131",
+            "\1\u0132",
+            "\1\u0133",
+            "\1\u0134",
+            "\1\u0135",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u0137",
+            "\1\u0138",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "",
+            "",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u013b",
+            "\1\u013c",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u013e",
+            "\1\u013f",
+            "",
+            "\1\u0140",
+            "\1\u0141",
+            "\1\u0142",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u0146",
+            "",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "",
+            "",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u014a",
+            "",
+            "\1\u014b",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u014d",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u014f",
+            "",
+            "",
+            "",
+            "\1\u0150",
+            "",
+            "",
+            "",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u0152",
+            "",
+            "\1\u0153",
+            "",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u0155",
+            "",
+            "\1\u0156",
+            "\1\u0157",
+            "",
+            "\1\u0158",
+            "\1\u0159",
+            "\1\u015a",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            "\1\u015d",
+            "",
+            "",
+            "\1\u015e",
+            "\1\61\13\uffff\12\61\7\uffff\32\61\4\uffff\1\61\1\uffff\32\61",
+            ""
+    };
+
+    static final short[] DFA17_eot = DFA.unpackEncodedString(DFA17_eotS);
+    static final short[] DFA17_eof = DFA.unpackEncodedString(DFA17_eofS);
+    static final char[] DFA17_min = DFA.unpackEncodedStringToUnsignedChars(DFA17_minS);
+    static final char[] DFA17_max = DFA.unpackEncodedStringToUnsignedChars(DFA17_maxS);
+    static final short[] DFA17_accept = DFA.unpackEncodedString(DFA17_acceptS);
+    static final short[] DFA17_special = DFA.unpackEncodedString(DFA17_specialS);
+    static final short[][] DFA17_transition;
+
+    static {
+        int numStates = DFA17_transitionS.length;
+        DFA17_transition = new short[numStates][];
+        for (int i=0; i<numStates; i++) {
+            DFA17_transition[i] = DFA.unpackEncodedString(DFA17_transitionS[i]);
+        }
+    }
+
+    class DFA17 extends DFA {
+
+        public DFA17(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 17;
+            this.eot = DFA17_eot;
+            this.eof = DFA17_eof;
+            this.min = DFA17_min;
+            this.max = DFA17_max;
+            this.accept = DFA17_accept;
+            this.special = DFA17_special;
+            this.transition = DFA17_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 | RULE_ID | RULE_INT | RULE_THEME_RESOURCE | RULE_EVENT_TOPIC | 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 LA17_0 = input.LA(1);
+
+                        s = -1;
+                        if ( (LA17_0=='+') ) {s = 1;}
+
+                        else if ( (LA17_0=='-') ) {s = 2;}
+
+                        else if ( (LA17_0=='e') ) {s = 3;}
+
+                        else if ( (LA17_0=='g') ) {s = 4;}
+
+                        else if ( (LA17_0=='l') ) {s = 5;}
+
+                        else if ( (LA17_0=='n') ) {s = 6;}
+
+                        else if ( (LA17_0=='f') ) {s = 7;}
+
+                        else if ( (LA17_0=='{') ) {s = 8;}
+
+                        else if ( (LA17_0=='i') ) {s = 9;}
+
+                        else if ( (LA17_0=='}') ) {s = 10;}
+
+                        else if ( (LA17_0=='&') ) {s = 11;}
+
+                        else if ( (LA17_0=='r') ) {s = 12;}
+
+                        else if ( (LA17_0=='=') ) {s = 13;}
+
+                        else if ( (LA17_0=='p') ) {s = 14;}
+
+                        else if ( (LA17_0=='s') ) {s = 15;}
+
+                        else if ( (LA17_0=='.') ) {s = 16;}
+
+                        else if ( (LA17_0=='b') ) {s = 17;}
+
+                        else if ( (LA17_0=='h') ) {s = 18;}
+
+                        else if ( (LA17_0=='d') ) {s = 19;}
+
+                        else if ( (LA17_0=='m') ) {s = 20;}
+
+                        else if ( (LA17_0=='q') ) {s = 21;}
+
+                        else if ( (LA17_0=='v') ) {s = 22;}
+
+                        else if ( (LA17_0=='u') ) {s = 23;}
+
+                        else if ( (LA17_0=='(') ) {s = 24;}
+
+                        else if ( (LA17_0==')') ) {s = 25;}
+
+                        else if ( (LA17_0=='c') ) {s = 26;}
+
+                        else if ( (LA17_0=='t') ) {s = 27;}
+
+                        else if ( (LA17_0=='[') ) {s = 28;}
+
+                        else if ( (LA17_0==']') ) {s = 29;}
+
+                        else if ( (LA17_0==',') ) {s = 30;}
+
+                        else if ( (LA17_0=='<') ) {s = 31;}
+
+                        else if ( (LA17_0=='>') ) {s = 32;}
+
+                        else if ( (LA17_0=='?') ) {s = 33;}
+
+                        else if ( (LA17_0=='*') ) {s = 34;}
+
+                        else if ( (LA17_0==';') ) {s = 35;}
+
+                        else if ( (LA17_0=='^') ) {s = 36;}
+
+                        else if ( (LA17_0=='$'||(LA17_0>='A' && LA17_0<='Z')||LA17_0=='_'||LA17_0=='a'||(LA17_0>='j' && LA17_0<='k')||LA17_0=='o'||(LA17_0>='w' && LA17_0<='z')) ) {s = 37;}
+
+                        else if ( ((LA17_0>='0' && LA17_0<='9')) ) {s = 38;}
+
+                        else if ( (LA17_0=='\'') ) {s = 39;}
+
+                        else if ( (LA17_0=='\"') ) {s = 40;}
+
+                        else if ( (LA17_0=='/') ) {s = 41;}
+
+                        else if ( ((LA17_0>='\t' && LA17_0<='\n')||LA17_0=='\r'||LA17_0==' ') ) {s = 42;}
+
+                        else if ( ((LA17_0>='\u0000' && LA17_0<='\b')||(LA17_0>='\u000B' && LA17_0<='\f')||(LA17_0>='\u000E' && LA17_0<='\u001F')||LA17_0=='!'||LA17_0=='#'||LA17_0=='%'||LA17_0==':'||LA17_0=='@'||LA17_0=='\\'||LA17_0=='`'||LA17_0=='|'||(LA17_0>='~' && LA17_0<='\uFFFF')) ) {s = 43;}
+
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 17, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+ 
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/internal/InternalGridSourceParser.java b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/internal/InternalGridSourceParser.java
new file mode 100644
index 0000000..d32b16f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/src-gen/org/eclipse/osbp/xtext/gridsource/ide/contentassist/antlr/internal/InternalGridSourceParser.java
@@ -0,0 +1,23088 @@
+package org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr.internal;
+
+import java.io.InputStream;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ide.editor.contentassist.antlr.internal.DFA;
+import org.eclipse.osbp.xtext.gridsource.services.GridSourceGrammarAccess;
+
+
+
+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 InternalGridSourceParser extends AbstractInternalContentAssistParser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_INT", "RULE_STRING", "RULE_THEME_RESOURCE", "RULE_EVENT_TOPIC", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'+'", "'-'", "'equal'", "'greater equal'", "'greater than'", "'lower equal'", "'lower than'", "'not equal'", "'gridsource'", "'for'", "'{'", "'inputs'", "'}'", "'inputType'", "'filters'", "'&&'", "'root:'", "'='", "'input:'", "'prop'", "'style'", "'.'", "'buttonStyle'", "'eventTopic'", "'htmlStyle'", "'boolStyle'", "'dateStyle'", "'format'", "'numberStyle'", "'progressbarStyle'", "'max'", "'indicatorStyle'", "'greenFrom'", "'redUntil'", "'quantityStyle'", "'value'", "'uom'", "'('", "')'", "'priceStyle'", "'currency'", "'textStyle'", "'imageStyle'", "'number'", "'then'", "'string'", "'['", "']'", "'=>'", "','", "'<'", "'>'", "'?'", "'extends'", "'&'", "'super'", "'*'", "'import'", "';'", "'static'", "'extension'"
+    };
+    public static final int T__50=50;
+    public static final int T__19=19;
+    public static final int T__15=15;
+    public static final int T__59=59;
+    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__55=55;
+    public static final int T__56=56;
+    public static final int T__13=13;
+    public static final int T__57=57;
+    public static final int T__14=14;
+    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 T__26=26;
+    public static final int T__27=27;
+    public static final int RULE_EVENT_TOPIC=8;
+    public static final int T__28=28;
+    public static final int RULE_INT=5;
+    public static final int T__29=29;
+    public static final int T__22=22;
+    public static final int T__66=66;
+    public static final int RULE_ML_COMMENT=9;
+    public static final int T__23=23;
+    public static final int T__67=67;
+    public static final int T__24=24;
+    public static final int T__68=68;
+    public static final int T__25=25;
+    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__20=20;
+    public static final int T__64=64;
+    public static final int T__21=21;
+    public static final int T__65=65;
+    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=6;
+    public static final int RULE_SL_COMMENT=10;
+    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__73=73;
+    public static final int EOF=-1;
+    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 RULE_WS=11;
+    public static final int RULE_ANY_OTHER=12;
+    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 RULE_THEME_RESOURCE=7;
+    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;
+
+    // delegates
+    // delegators
+
+
+        public InternalGridSourceParser(TokenStream input) {
+            this(input, new RecognizerSharedState());
+        }
+        public InternalGridSourceParser(TokenStream input, RecognizerSharedState state) {
+            super(input, state);
+             
+        }
+        
+
+    public String[] getTokenNames() { return InternalGridSourceParser.tokenNames; }
+    public String getGrammarFileName() { return "InternalGridSource.g"; }
+
+
+    	private GridSourceGrammarAccess grammarAccess;
+
+    	public void setGrammarAccess(GridSourceGrammarAccess grammarAccess) {
+    		this.grammarAccess = grammarAccess;
+    	}
+
+    	@Override
+    	protected Grammar getGrammar() {
+    		return grammarAccess.getGrammar();
+    	}
+
+    	@Override
+    	protected String getValueForTokenName(String tokenName) {
+    		return tokenName;
+    	}
+
+
+
+    // $ANTLR start "entryRuleSource"
+    // InternalGridSource.g:54:1: entryRuleSource : ruleSource EOF ;
+    public final void entryRuleSource() throws RecognitionException {
+        try {
+            // InternalGridSource.g:55:1: ( ruleSource EOF )
+            // InternalGridSource.g:56:1: ruleSource EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleSource();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSource"
+
+
+    // $ANTLR start "ruleSource"
+    // InternalGridSource.g:63:1: ruleSource : ( ( rule__Source__Group__0 ) ) ;
+    public final void ruleSource() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:67:2: ( ( ( rule__Source__Group__0 ) ) )
+            // InternalGridSource.g:68:2: ( ( rule__Source__Group__0 ) )
+            {
+            // InternalGridSource.g:68:2: ( ( rule__Source__Group__0 ) )
+            // InternalGridSource.g:69:3: ( rule__Source__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getGroup()); 
+            }
+            // InternalGridSource.g:70:3: ( rule__Source__Group__0 )
+            // InternalGridSource.g:70:4: rule__Source__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__Source__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleSource"
+
+
+    // $ANTLR start "entryRuleInput"
+    // InternalGridSource.g:79:1: entryRuleInput : ruleInput EOF ;
+    public final void entryRuleInput() throws RecognitionException {
+        try {
+            // InternalGridSource.g:80:1: ( ruleInput EOF )
+            // InternalGridSource.g:81:1: ruleInput EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleInput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleInput"
+
+
+    // $ANTLR start "ruleInput"
+    // InternalGridSource.g:88:1: ruleInput : ( ( rule__Input__Group__0 ) ) ;
+    public final void ruleInput() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:92:2: ( ( ( rule__Input__Group__0 ) ) )
+            // InternalGridSource.g:93:2: ( ( rule__Input__Group__0 ) )
+            {
+            // InternalGridSource.g:93:2: ( ( rule__Input__Group__0 ) )
+            // InternalGridSource.g:94:3: ( rule__Input__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getGroup()); 
+            }
+            // InternalGridSource.g:95:3: ( rule__Input__Group__0 )
+            // InternalGridSource.g:95:4: rule__Input__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__Input__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleInput"
+
+
+    // $ANTLR start "entryRuleEQFilter"
+    // InternalGridSource.g:104:1: entryRuleEQFilter : ruleEQFilter EOF ;
+    public final void entryRuleEQFilter() throws RecognitionException {
+        try {
+            // InternalGridSource.g:105:1: ( ruleEQFilter EOF )
+            // InternalGridSource.g:106:1: ruleEQFilter EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleEQFilter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEQFilterRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEQFilter"
+
+
+    // $ANTLR start "ruleEQFilter"
+    // InternalGridSource.g:113:1: ruleEQFilter : ( ( rule__EQFilter__Group__0 ) ) ;
+    public final void ruleEQFilter() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:117:2: ( ( ( rule__EQFilter__Group__0 ) ) )
+            // InternalGridSource.g:118:2: ( ( rule__EQFilter__Group__0 ) )
+            {
+            // InternalGridSource.g:118:2: ( ( rule__EQFilter__Group__0 ) )
+            // InternalGridSource.g:119:3: ( rule__EQFilter__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getGroup()); 
+            }
+            // InternalGridSource.g:120:3: ( rule__EQFilter__Group__0 )
+            // InternalGridSource.g:120:4: rule__EQFilter__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__EQFilter__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEQFilterAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleEQFilter"
+
+
+    // $ANTLR start "entryRuleProperty"
+    // InternalGridSource.g:129:1: entryRuleProperty : ruleProperty EOF ;
+    public final void entryRuleProperty() throws RecognitionException {
+        try {
+            // InternalGridSource.g:130:1: ( ruleProperty EOF )
+            // InternalGridSource.g:131:1: ruleProperty EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleProperty();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleProperty"
+
+
+    // $ANTLR start "ruleProperty"
+    // InternalGridSource.g:138:1: ruleProperty : ( ( rule__Property__Group__0 ) ) ;
+    public final void ruleProperty() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:142:2: ( ( ( rule__Property__Group__0 ) ) )
+            // InternalGridSource.g:143:2: ( ( rule__Property__Group__0 ) )
+            {
+            // InternalGridSource.g:143:2: ( ( rule__Property__Group__0 ) )
+            // InternalGridSource.g:144:3: ( rule__Property__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyAccess().getGroup()); 
+            }
+            // InternalGridSource.g:145:3: ( rule__Property__Group__0 )
+            // InternalGridSource.g:145:4: rule__Property__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__Property__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleProperty"
+
+
+    // $ANTLR start "entryRuleNestedField"
+    // InternalGridSource.g:154:1: entryRuleNestedField : ruleNestedField EOF ;
+    public final void entryRuleNestedField() throws RecognitionException {
+        try {
+            // InternalGridSource.g:155:1: ( ruleNestedField EOF )
+            // InternalGridSource.g:156:1: ruleNestedField EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedFieldRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleNestedField();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedFieldRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleNestedField"
+
+
+    // $ANTLR start "ruleNestedField"
+    // InternalGridSource.g:163:1: ruleNestedField : ( ( rule__NestedField__Group__0 ) ) ;
+    public final void ruleNestedField() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:167:2: ( ( ( rule__NestedField__Group__0 ) ) )
+            // InternalGridSource.g:168:2: ( ( rule__NestedField__Group__0 ) )
+            {
+            // InternalGridSource.g:168:2: ( ( rule__NestedField__Group__0 ) )
+            // InternalGridSource.g:169:3: ( rule__NestedField__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedFieldAccess().getGroup()); 
+            }
+            // InternalGridSource.g:170:3: ( rule__NestedField__Group__0 )
+            // InternalGridSource.g:170:4: rule__NestedField__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__NestedField__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedFieldAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleNestedField"
+
+
+    // $ANTLR start "entryRuleNestedPath"
+    // InternalGridSource.g:179:1: entryRuleNestedPath : ruleNestedPath EOF ;
+    public final void entryRuleNestedPath() throws RecognitionException {
+        try {
+            // InternalGridSource.g:180:1: ( ruleNestedPath EOF )
+            // InternalGridSource.g:181:1: ruleNestedPath EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleNestedPath();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedPathRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleNestedPath"
+
+
+    // $ANTLR start "ruleNestedPath"
+    // InternalGridSource.g:188:1: ruleNestedPath : ( ( rule__NestedPath__Group__0 ) ) ;
+    public final void ruleNestedPath() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:192:2: ( ( ( rule__NestedPath__Group__0 ) ) )
+            // InternalGridSource.g:193:2: ( ( rule__NestedPath__Group__0 ) )
+            {
+            // InternalGridSource.g:193:2: ( ( rule__NestedPath__Group__0 ) )
+            // InternalGridSource.g:194:3: ( rule__NestedPath__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathAccess().getGroup()); 
+            }
+            // InternalGridSource.g:195:3: ( rule__NestedPath__Group__0 )
+            // InternalGridSource.g:195:4: rule__NestedPath__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__NestedPath__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedPathAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleNestedPath"
+
+
+    // $ANTLR start "entryRulePropertyStyle"
+    // InternalGridSource.g:204:1: entryRulePropertyStyle : rulePropertyStyle EOF ;
+    public final void entryRulePropertyStyle() throws RecognitionException {
+        try {
+            // InternalGridSource.g:205:1: ( rulePropertyStyle EOF )
+            // InternalGridSource.g:206:1: rulePropertyStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyStyleRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyStyle"
+
+
+    // $ANTLR start "rulePropertyStyle"
+    // InternalGridSource.g:213:1: rulePropertyStyle : ( ( rule__PropertyStyle__Alternatives ) ) ;
+    public final void rulePropertyStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:217:2: ( ( ( rule__PropertyStyle__Alternatives ) ) )
+            // InternalGridSource.g:218:2: ( ( rule__PropertyStyle__Alternatives ) )
+            {
+            // InternalGridSource.g:218:2: ( ( rule__PropertyStyle__Alternatives ) )
+            // InternalGridSource.g:219:3: ( rule__PropertyStyle__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyStyleAccess().getAlternatives()); 
+            }
+            // InternalGridSource.g:220:3: ( rule__PropertyStyle__Alternatives )
+            // InternalGridSource.g:220:4: rule__PropertyStyle__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyStyle__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyStyleAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyStyle"
+
+
+    // $ANTLR start "entryRulePropertyButtonStyle"
+    // InternalGridSource.g:229:1: entryRulePropertyButtonStyle : rulePropertyButtonStyle EOF ;
+    public final void entryRulePropertyButtonStyle() throws RecognitionException {
+        try {
+            // InternalGridSource.g:230:1: ( rulePropertyButtonStyle EOF )
+            // InternalGridSource.g:231:1: rulePropertyButtonStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyButtonStyleRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyButtonStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyButtonStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyButtonStyle"
+
+
+    // $ANTLR start "rulePropertyButtonStyle"
+    // InternalGridSource.g:238:1: rulePropertyButtonStyle : ( ( rule__PropertyButtonStyle__Group__0 ) ) ;
+    public final void rulePropertyButtonStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:242:2: ( ( ( rule__PropertyButtonStyle__Group__0 ) ) )
+            // InternalGridSource.g:243:2: ( ( rule__PropertyButtonStyle__Group__0 ) )
+            {
+            // InternalGridSource.g:243:2: ( ( rule__PropertyButtonStyle__Group__0 ) )
+            // InternalGridSource.g:244:3: ( rule__PropertyButtonStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyButtonStyleAccess().getGroup()); 
+            }
+            // InternalGridSource.g:245:3: ( rule__PropertyButtonStyle__Group__0 )
+            // InternalGridSource.g:245:4: rule__PropertyButtonStyle__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyButtonStyle__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyButtonStyleAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyButtonStyle"
+
+
+    // $ANTLR start "entryRulePropertyHtmlStyle"
+    // InternalGridSource.g:254:1: entryRulePropertyHtmlStyle : rulePropertyHtmlStyle EOF ;
+    public final void entryRulePropertyHtmlStyle() throws RecognitionException {
+        try {
+            // InternalGridSource.g:255:1: ( rulePropertyHtmlStyle EOF )
+            // InternalGridSource.g:256:1: rulePropertyHtmlStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyHtmlStyleRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyHtmlStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyHtmlStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyHtmlStyle"
+
+
+    // $ANTLR start "rulePropertyHtmlStyle"
+    // InternalGridSource.g:263:1: rulePropertyHtmlStyle : ( ( rule__PropertyHtmlStyle__Group__0 ) ) ;
+    public final void rulePropertyHtmlStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:267:2: ( ( ( rule__PropertyHtmlStyle__Group__0 ) ) )
+            // InternalGridSource.g:268:2: ( ( rule__PropertyHtmlStyle__Group__0 ) )
+            {
+            // InternalGridSource.g:268:2: ( ( rule__PropertyHtmlStyle__Group__0 ) )
+            // InternalGridSource.g:269:3: ( rule__PropertyHtmlStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyHtmlStyleAccess().getGroup()); 
+            }
+            // InternalGridSource.g:270:3: ( rule__PropertyHtmlStyle__Group__0 )
+            // InternalGridSource.g:270:4: rule__PropertyHtmlStyle__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyHtmlStyle__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyHtmlStyleAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyHtmlStyle"
+
+
+    // $ANTLR start "entryRulePropertyBooleanStyle"
+    // InternalGridSource.g:279:1: entryRulePropertyBooleanStyle : rulePropertyBooleanStyle EOF ;
+    public final void entryRulePropertyBooleanStyle() throws RecognitionException {
+        try {
+            // InternalGridSource.g:280:1: ( rulePropertyBooleanStyle EOF )
+            // InternalGridSource.g:281:1: rulePropertyBooleanStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyBooleanStyleRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyBooleanStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyBooleanStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyBooleanStyle"
+
+
+    // $ANTLR start "rulePropertyBooleanStyle"
+    // InternalGridSource.g:288:1: rulePropertyBooleanStyle : ( ( rule__PropertyBooleanStyle__Group__0 ) ) ;
+    public final void rulePropertyBooleanStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:292:2: ( ( ( rule__PropertyBooleanStyle__Group__0 ) ) )
+            // InternalGridSource.g:293:2: ( ( rule__PropertyBooleanStyle__Group__0 ) )
+            {
+            // InternalGridSource.g:293:2: ( ( rule__PropertyBooleanStyle__Group__0 ) )
+            // InternalGridSource.g:294:3: ( rule__PropertyBooleanStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyBooleanStyleAccess().getGroup()); 
+            }
+            // InternalGridSource.g:295:3: ( rule__PropertyBooleanStyle__Group__0 )
+            // InternalGridSource.g:295:4: rule__PropertyBooleanStyle__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyBooleanStyle__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyBooleanStyleAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyBooleanStyle"
+
+
+    // $ANTLR start "entryRulePropertyDateStyle"
+    // InternalGridSource.g:304:1: entryRulePropertyDateStyle : rulePropertyDateStyle EOF ;
+    public final void entryRulePropertyDateStyle() throws RecognitionException {
+        try {
+            // InternalGridSource.g:305:1: ( rulePropertyDateStyle EOF )
+            // InternalGridSource.g:306:1: rulePropertyDateStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyDateStyleRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyDateStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyDateStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyDateStyle"
+
+
+    // $ANTLR start "rulePropertyDateStyle"
+    // InternalGridSource.g:313:1: rulePropertyDateStyle : ( ( rule__PropertyDateStyle__Group__0 ) ) ;
+    public final void rulePropertyDateStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:317:2: ( ( ( rule__PropertyDateStyle__Group__0 ) ) )
+            // InternalGridSource.g:318:2: ( ( rule__PropertyDateStyle__Group__0 ) )
+            {
+            // InternalGridSource.g:318:2: ( ( rule__PropertyDateStyle__Group__0 ) )
+            // InternalGridSource.g:319:3: ( rule__PropertyDateStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyDateStyleAccess().getGroup()); 
+            }
+            // InternalGridSource.g:320:3: ( rule__PropertyDateStyle__Group__0 )
+            // InternalGridSource.g:320:4: rule__PropertyDateStyle__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyDateStyle__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyDateStyleAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyDateStyle"
+
+
+    // $ANTLR start "entryRulePropertyNumberStyle"
+    // InternalGridSource.g:329:1: entryRulePropertyNumberStyle : rulePropertyNumberStyle EOF ;
+    public final void entryRulePropertyNumberStyle() throws RecognitionException {
+        try {
+            // InternalGridSource.g:330:1: ( rulePropertyNumberStyle EOF )
+            // InternalGridSource.g:331:1: rulePropertyNumberStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyNumberStyleRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyNumberStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyNumberStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyNumberStyle"
+
+
+    // $ANTLR start "rulePropertyNumberStyle"
+    // InternalGridSource.g:338:1: rulePropertyNumberStyle : ( ( rule__PropertyNumberStyle__Group__0 ) ) ;
+    public final void rulePropertyNumberStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:342:2: ( ( ( rule__PropertyNumberStyle__Group__0 ) ) )
+            // InternalGridSource.g:343:2: ( ( rule__PropertyNumberStyle__Group__0 ) )
+            {
+            // InternalGridSource.g:343:2: ( ( rule__PropertyNumberStyle__Group__0 ) )
+            // InternalGridSource.g:344:3: ( rule__PropertyNumberStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyNumberStyleAccess().getGroup()); 
+            }
+            // InternalGridSource.g:345:3: ( rule__PropertyNumberStyle__Group__0 )
+            // InternalGridSource.g:345:4: rule__PropertyNumberStyle__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyNumberStyle__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyNumberStyleAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyNumberStyle"
+
+
+    // $ANTLR start "entryRulePropertyProgressbarStyle"
+    // InternalGridSource.g:354:1: entryRulePropertyProgressbarStyle : rulePropertyProgressbarStyle EOF ;
+    public final void entryRulePropertyProgressbarStyle() throws RecognitionException {
+        try {
+            // InternalGridSource.g:355:1: ( rulePropertyProgressbarStyle EOF )
+            // InternalGridSource.g:356:1: rulePropertyProgressbarStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyProgressbarStyleRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyProgressbarStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyProgressbarStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyProgressbarStyle"
+
+
+    // $ANTLR start "rulePropertyProgressbarStyle"
+    // InternalGridSource.g:363:1: rulePropertyProgressbarStyle : ( ( rule__PropertyProgressbarStyle__Group__0 ) ) ;
+    public final void rulePropertyProgressbarStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:367:2: ( ( ( rule__PropertyProgressbarStyle__Group__0 ) ) )
+            // InternalGridSource.g:368:2: ( ( rule__PropertyProgressbarStyle__Group__0 ) )
+            {
+            // InternalGridSource.g:368:2: ( ( rule__PropertyProgressbarStyle__Group__0 ) )
+            // InternalGridSource.g:369:3: ( rule__PropertyProgressbarStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyProgressbarStyleAccess().getGroup()); 
+            }
+            // InternalGridSource.g:370:3: ( rule__PropertyProgressbarStyle__Group__0 )
+            // InternalGridSource.g:370:4: rule__PropertyProgressbarStyle__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyProgressbarStyle__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyProgressbarStyleAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyProgressbarStyle"
+
+
+    // $ANTLR start "entryRuleGridPropIndicatorStyle"
+    // InternalGridSource.g:379:1: entryRuleGridPropIndicatorStyle : ruleGridPropIndicatorStyle EOF ;
+    public final void entryRuleGridPropIndicatorStyle() throws RecognitionException {
+        try {
+            // InternalGridSource.g:380:1: ( ruleGridPropIndicatorStyle EOF )
+            // InternalGridSource.g:381:1: ruleGridPropIndicatorStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleGridPropIndicatorStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGridPropIndicatorStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleGridPropIndicatorStyle"
+
+
+    // $ANTLR start "ruleGridPropIndicatorStyle"
+    // InternalGridSource.g:388:1: ruleGridPropIndicatorStyle : ( ( rule__GridPropIndicatorStyle__Group__0 ) ) ;
+    public final void ruleGridPropIndicatorStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:392:2: ( ( ( rule__GridPropIndicatorStyle__Group__0 ) ) )
+            // InternalGridSource.g:393:2: ( ( rule__GridPropIndicatorStyle__Group__0 ) )
+            {
+            // InternalGridSource.g:393:2: ( ( rule__GridPropIndicatorStyle__Group__0 ) )
+            // InternalGridSource.g:394:3: ( rule__GridPropIndicatorStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getGroup()); 
+            }
+            // InternalGridSource.g:395:3: ( rule__GridPropIndicatorStyle__Group__0 )
+            // InternalGridSource.g:395:4: rule__GridPropIndicatorStyle__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__GridPropIndicatorStyle__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGridPropIndicatorStyleAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleGridPropIndicatorStyle"
+
+
+    // $ANTLR start "entryRulePropertyQuantityStyle"
+    // InternalGridSource.g:404:1: entryRulePropertyQuantityStyle : rulePropertyQuantityStyle EOF ;
+    public final void entryRulePropertyQuantityStyle() throws RecognitionException {
+        try {
+            // InternalGridSource.g:405:1: ( rulePropertyQuantityStyle EOF )
+            // InternalGridSource.g:406:1: rulePropertyQuantityStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyQuantityStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyQuantityStyle"
+
+
+    // $ANTLR start "rulePropertyQuantityStyle"
+    // InternalGridSource.g:413:1: rulePropertyQuantityStyle : ( ( rule__PropertyQuantityStyle__Group__0 ) ) ;
+    public final void rulePropertyQuantityStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:417:2: ( ( ( rule__PropertyQuantityStyle__Group__0 ) ) )
+            // InternalGridSource.g:418:2: ( ( rule__PropertyQuantityStyle__Group__0 ) )
+            {
+            // InternalGridSource.g:418:2: ( ( rule__PropertyQuantityStyle__Group__0 ) )
+            // InternalGridSource.g:419:3: ( rule__PropertyQuantityStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getGroup()); 
+            }
+            // InternalGridSource.g:420:3: ( rule__PropertyQuantityStyle__Group__0 )
+            // InternalGridSource.g:420:4: rule__PropertyQuantityStyle__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyQuantityStyle"
+
+
+    // $ANTLR start "entryRulePropertyPriceStyle"
+    // InternalGridSource.g:429:1: entryRulePropertyPriceStyle : rulePropertyPriceStyle EOF ;
+    public final void entryRulePropertyPriceStyle() throws RecognitionException {
+        try {
+            // InternalGridSource.g:430:1: ( rulePropertyPriceStyle EOF )
+            // InternalGridSource.g:431:1: rulePropertyPriceStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyPriceStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyPriceStyle"
+
+
+    // $ANTLR start "rulePropertyPriceStyle"
+    // InternalGridSource.g:438:1: rulePropertyPriceStyle : ( ( rule__PropertyPriceStyle__Group__0 ) ) ;
+    public final void rulePropertyPriceStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:442:2: ( ( ( rule__PropertyPriceStyle__Group__0 ) ) )
+            // InternalGridSource.g:443:2: ( ( rule__PropertyPriceStyle__Group__0 ) )
+            {
+            // InternalGridSource.g:443:2: ( ( rule__PropertyPriceStyle__Group__0 ) )
+            // InternalGridSource.g:444:3: ( rule__PropertyPriceStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getGroup()); 
+            }
+            // InternalGridSource.g:445:3: ( rule__PropertyPriceStyle__Group__0 )
+            // InternalGridSource.g:445:4: rule__PropertyPriceStyle__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyPriceStyle"
+
+
+    // $ANTLR start "entryRulePropertyTextStyle"
+    // InternalGridSource.g:454:1: entryRulePropertyTextStyle : rulePropertyTextStyle EOF ;
+    public final void entryRulePropertyTextStyle() throws RecognitionException {
+        try {
+            // InternalGridSource.g:455:1: ( rulePropertyTextStyle EOF )
+            // InternalGridSource.g:456:1: rulePropertyTextStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyTextStyleRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyTextStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyTextStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyTextStyle"
+
+
+    // $ANTLR start "rulePropertyTextStyle"
+    // InternalGridSource.g:463:1: rulePropertyTextStyle : ( ( rule__PropertyTextStyle__Group__0 ) ) ;
+    public final void rulePropertyTextStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:467:2: ( ( ( rule__PropertyTextStyle__Group__0 ) ) )
+            // InternalGridSource.g:468:2: ( ( rule__PropertyTextStyle__Group__0 ) )
+            {
+            // InternalGridSource.g:468:2: ( ( rule__PropertyTextStyle__Group__0 ) )
+            // InternalGridSource.g:469:3: ( rule__PropertyTextStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyTextStyleAccess().getGroup()); 
+            }
+            // InternalGridSource.g:470:3: ( rule__PropertyTextStyle__Group__0 )
+            // InternalGridSource.g:470:4: rule__PropertyTextStyle__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyTextStyle__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyTextStyleAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyTextStyle"
+
+
+    // $ANTLR start "entryRulePropertyImageStyle"
+    // InternalGridSource.g:479:1: entryRulePropertyImageStyle : rulePropertyImageStyle EOF ;
+    public final void entryRulePropertyImageStyle() throws RecognitionException {
+        try {
+            // InternalGridSource.g:480:1: ( rulePropertyImageStyle EOF )
+            // InternalGridSource.g:481:1: rulePropertyImageStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyImageStyleRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            rulePropertyImageStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyImageStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyImageStyle"
+
+
+    // $ANTLR start "rulePropertyImageStyle"
+    // InternalGridSource.g:488:1: rulePropertyImageStyle : ( ( rule__PropertyImageStyle__Group__0 ) ) ;
+    public final void rulePropertyImageStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:492:2: ( ( ( rule__PropertyImageStyle__Group__0 ) ) )
+            // InternalGridSource.g:493:2: ( ( rule__PropertyImageStyle__Group__0 ) )
+            {
+            // InternalGridSource.g:493:2: ( ( rule__PropertyImageStyle__Group__0 ) )
+            // InternalGridSource.g:494:3: ( rule__PropertyImageStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyImageStyleAccess().getGroup()); 
+            }
+            // InternalGridSource.g:495:3: ( rule__PropertyImageStyle__Group__0 )
+            // InternalGridSource.g:495:4: rule__PropertyImageStyle__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyImageStyle__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyImageStyleAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rulePropertyImageStyle"
+
+
+    // $ANTLR start "entryRuleQualifiedName"
+    // InternalGridSource.g:504:1: entryRuleQualifiedName : ruleQualifiedName EOF ;
+    public final void entryRuleQualifiedName() throws RecognitionException {
+        try {
+            // InternalGridSource.g:505:1: ( ruleQualifiedName EOF )
+            // InternalGridSource.g:506:1: ruleQualifiedName EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleQualifiedName"
+
+
+    // $ANTLR start "ruleQualifiedName"
+    // InternalGridSource.g:513:1: ruleQualifiedName : ( ( rule__QualifiedName__Group__0 ) ) ;
+    public final void ruleQualifiedName() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:517:2: ( ( ( rule__QualifiedName__Group__0 ) ) )
+            // InternalGridSource.g:518:2: ( ( rule__QualifiedName__Group__0 ) )
+            {
+            // InternalGridSource.g:518:2: ( ( rule__QualifiedName__Group__0 ) )
+            // InternalGridSource.g:519:3: ( rule__QualifiedName__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameAccess().getGroup()); 
+            }
+            // InternalGridSource.g:520:3: ( rule__QualifiedName__Group__0 )
+            // InternalGridSource.g:520:4: rule__QualifiedName__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__QualifiedName__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleQualifiedName"
+
+
+    // $ANTLR start "entryRuleValidID"
+    // InternalGridSource.g:529:1: entryRuleValidID : ruleValidID EOF ;
+    public final void entryRuleValidID() throws RecognitionException {
+        try {
+            // InternalGridSource.g:530:1: ( ruleValidID EOF )
+            // InternalGridSource.g:531:1: ruleValidID EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValidIDRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValidIDRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleValidID"
+
+
+    // $ANTLR start "ruleValidID"
+    // InternalGridSource.g:538:1: ruleValidID : ( RULE_ID ) ;
+    public final void ruleValidID() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:542:2: ( ( RULE_ID ) )
+            // InternalGridSource.g:543:2: ( RULE_ID )
+            {
+            // InternalGridSource.g:543:2: ( RULE_ID )
+            // InternalGridSource.g:544:3: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleValidID"
+
+
+    // $ANTLR start "entryRuleStyleConfig"
+    // InternalGridSource.g:554:1: entryRuleStyleConfig : ruleStyleConfig EOF ;
+    public final void entryRuleStyleConfig() throws RecognitionException {
+        try {
+            // InternalGridSource.g:555:1: ( ruleStyleConfig EOF )
+            // InternalGridSource.g:556:1: ruleStyleConfig EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStyleConfigRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleStyleConfig();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStyleConfigRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleStyleConfig"
+
+
+    // $ANTLR start "ruleStyleConfig"
+    // InternalGridSource.g:563:1: ruleStyleConfig : ( ( rule__StyleConfig__Alternatives ) ) ;
+    public final void ruleStyleConfig() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:567:2: ( ( ( rule__StyleConfig__Alternatives ) ) )
+            // InternalGridSource.g:568:2: ( ( rule__StyleConfig__Alternatives ) )
+            {
+            // InternalGridSource.g:568:2: ( ( rule__StyleConfig__Alternatives ) )
+            // InternalGridSource.g:569:3: ( rule__StyleConfig__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStyleConfigAccess().getAlternatives()); 
+            }
+            // InternalGridSource.g:570:3: ( rule__StyleConfig__Alternatives )
+            // InternalGridSource.g:570:4: rule__StyleConfig__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__StyleConfig__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStyleConfigAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleStyleConfig"
+
+
+    // $ANTLR start "entryRuleNumericToResourceStyleConfig"
+    // InternalGridSource.g:579:1: entryRuleNumericToResourceStyleConfig : ruleNumericToResourceStyleConfig EOF ;
+    public final void entryRuleNumericToResourceStyleConfig() throws RecognitionException {
+        try {
+            // InternalGridSource.g:580:1: ( ruleNumericToResourceStyleConfig EOF )
+            // InternalGridSource.g:581:1: ruleNumericToResourceStyleConfig EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumericToResourceStyleConfigRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleNumericToResourceStyleConfig();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumericToResourceStyleConfigRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleNumericToResourceStyleConfig"
+
+
+    // $ANTLR start "ruleNumericToResourceStyleConfig"
+    // InternalGridSource.g:588:1: ruleNumericToResourceStyleConfig : ( ( rule__NumericToResourceStyleConfig__Group__0 ) ) ;
+    public final void ruleNumericToResourceStyleConfig() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:592:2: ( ( ( rule__NumericToResourceStyleConfig__Group__0 ) ) )
+            // InternalGridSource.g:593:2: ( ( rule__NumericToResourceStyleConfig__Group__0 ) )
+            {
+            // InternalGridSource.g:593:2: ( ( rule__NumericToResourceStyleConfig__Group__0 ) )
+            // InternalGridSource.g:594:3: ( rule__NumericToResourceStyleConfig__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumericToResourceStyleConfigAccess().getGroup()); 
+            }
+            // InternalGridSource.g:595:3: ( rule__NumericToResourceStyleConfig__Group__0 )
+            // InternalGridSource.g:595:4: rule__NumericToResourceStyleConfig__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__NumericToResourceStyleConfig__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumericToResourceStyleConfigAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleNumericToResourceStyleConfig"
+
+
+    // $ANTLR start "entryRuleStringToResourceStyleConfig"
+    // InternalGridSource.g:604:1: entryRuleStringToResourceStyleConfig : ruleStringToResourceStyleConfig EOF ;
+    public final void entryRuleStringToResourceStyleConfig() throws RecognitionException {
+        try {
+            // InternalGridSource.g:605:1: ( ruleStringToResourceStyleConfig EOF )
+            // InternalGridSource.g:606:1: ruleStringToResourceStyleConfig EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStringToResourceStyleConfigRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleStringToResourceStyleConfig();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStringToResourceStyleConfigRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleStringToResourceStyleConfig"
+
+
+    // $ANTLR start "ruleStringToResourceStyleConfig"
+    // InternalGridSource.g:613:1: ruleStringToResourceStyleConfig : ( ( rule__StringToResourceStyleConfig__Group__0 ) ) ;
+    public final void ruleStringToResourceStyleConfig() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:617:2: ( ( ( rule__StringToResourceStyleConfig__Group__0 ) ) )
+            // InternalGridSource.g:618:2: ( ( rule__StringToResourceStyleConfig__Group__0 ) )
+            {
+            // InternalGridSource.g:618:2: ( ( rule__StringToResourceStyleConfig__Group__0 ) )
+            // InternalGridSource.g:619:3: ( rule__StringToResourceStyleConfig__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStringToResourceStyleConfigAccess().getGroup()); 
+            }
+            // InternalGridSource.g:620:3: ( rule__StringToResourceStyleConfig__Group__0 )
+            // InternalGridSource.g:620:4: rule__StringToResourceStyleConfig__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__StringToResourceStyleConfig__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStringToResourceStyleConfigAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleStringToResourceStyleConfig"
+
+
+    // $ANTLR start "entryRuleLInt"
+    // InternalGridSource.g:629:1: entryRuleLInt : ruleLInt EOF ;
+    public final void entryRuleLInt() throws RecognitionException {
+        try {
+            // InternalGridSource.g:630:1: ( ruleLInt EOF )
+            // InternalGridSource.g:631:1: ruleLInt EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLIntRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleLInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLIntRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLInt"
+
+
+    // $ANTLR start "ruleLInt"
+    // InternalGridSource.g:638:1: ruleLInt : ( ( rule__LInt__Group__0 ) ) ;
+    public final void ruleLInt() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:642:2: ( ( ( rule__LInt__Group__0 ) ) )
+            // InternalGridSource.g:643:2: ( ( rule__LInt__Group__0 ) )
+            {
+            // InternalGridSource.g:643:2: ( ( rule__LInt__Group__0 ) )
+            // InternalGridSource.g:644:3: ( rule__LInt__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLIntAccess().getGroup()); 
+            }
+            // InternalGridSource.g:645:3: ( rule__LInt__Group__0 )
+            // InternalGridSource.g:645:4: rule__LInt__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__LInt__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLIntAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLInt"
+
+
+    // $ANTLR start "entryRuleLDouble"
+    // InternalGridSource.g:654:1: entryRuleLDouble : ruleLDouble EOF ;
+    public final void entryRuleLDouble() throws RecognitionException {
+        try {
+            // InternalGridSource.g:655:1: ( ruleLDouble EOF )
+            // InternalGridSource.g:656:1: ruleLDouble EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLDoubleRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleLDouble();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLDoubleRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLDouble"
+
+
+    // $ANTLR start "ruleLDouble"
+    // InternalGridSource.g:663:1: ruleLDouble : ( ( rule__LDouble__Group__0 ) ) ;
+    public final void ruleLDouble() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:667:2: ( ( ( rule__LDouble__Group__0 ) ) )
+            // InternalGridSource.g:668:2: ( ( rule__LDouble__Group__0 ) )
+            {
+            // InternalGridSource.g:668:2: ( ( rule__LDouble__Group__0 ) )
+            // InternalGridSource.g:669:3: ( rule__LDouble__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLDoubleAccess().getGroup()); 
+            }
+            // InternalGridSource.g:670:3: ( rule__LDouble__Group__0 )
+            // InternalGridSource.g:670:4: rule__LDouble__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__LDouble__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLDoubleAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleLDouble"
+
+
+    // $ANTLR start "entryRuleJvmTypeReference"
+    // InternalGridSource.g:679:1: entryRuleJvmTypeReference : ruleJvmTypeReference EOF ;
+    public final void entryRuleJvmTypeReference() throws RecognitionException {
+        try {
+            // InternalGridSource.g:680:1: ( ruleJvmTypeReference EOF )
+            // InternalGridSource.g:681:1: ruleJvmTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmTypeReference"
+
+
+    // $ANTLR start "ruleJvmTypeReference"
+    // InternalGridSource.g:688:1: ruleJvmTypeReference : ( ( rule__JvmTypeReference__Alternatives ) ) ;
+    public final void ruleJvmTypeReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:692:2: ( ( ( rule__JvmTypeReference__Alternatives ) ) )
+            // InternalGridSource.g:693:2: ( ( rule__JvmTypeReference__Alternatives ) )
+            {
+            // InternalGridSource.g:693:2: ( ( rule__JvmTypeReference__Alternatives ) )
+            // InternalGridSource.g:694:3: ( rule__JvmTypeReference__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
+            }
+            // InternalGridSource.g:695:3: ( rule__JvmTypeReference__Alternatives )
+            // InternalGridSource.g:695:4: rule__JvmTypeReference__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmTypeReference__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmTypeReference"
+
+
+    // $ANTLR start "entryRuleArrayBrackets"
+    // InternalGridSource.g:704:1: entryRuleArrayBrackets : ruleArrayBrackets EOF ;
+    public final void entryRuleArrayBrackets() throws RecognitionException {
+        try {
+            // InternalGridSource.g:705:1: ( ruleArrayBrackets EOF )
+            // InternalGridSource.g:706:1: ruleArrayBrackets EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArrayBracketsRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleArrayBrackets();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArrayBracketsRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleArrayBrackets"
+
+
+    // $ANTLR start "ruleArrayBrackets"
+    // InternalGridSource.g:713:1: ruleArrayBrackets : ( ( rule__ArrayBrackets__Group__0 ) ) ;
+    public final void ruleArrayBrackets() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:717:2: ( ( ( rule__ArrayBrackets__Group__0 ) ) )
+            // InternalGridSource.g:718:2: ( ( rule__ArrayBrackets__Group__0 ) )
+            {
+            // InternalGridSource.g:718:2: ( ( rule__ArrayBrackets__Group__0 ) )
+            // InternalGridSource.g:719:3: ( rule__ArrayBrackets__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArrayBracketsAccess().getGroup()); 
+            }
+            // InternalGridSource.g:720:3: ( rule__ArrayBrackets__Group__0 )
+            // InternalGridSource.g:720:4: rule__ArrayBrackets__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__ArrayBrackets__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArrayBracketsAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleArrayBrackets"
+
+
+    // $ANTLR start "entryRuleXFunctionTypeRef"
+    // InternalGridSource.g:729:1: entryRuleXFunctionTypeRef : ruleXFunctionTypeRef EOF ;
+    public final void entryRuleXFunctionTypeRef() throws RecognitionException {
+        try {
+            // InternalGridSource.g:730:1: ( ruleXFunctionTypeRef EOF )
+            // InternalGridSource.g:731:1: ruleXFunctionTypeRef EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXFunctionTypeRef();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXFunctionTypeRef"
+
+
+    // $ANTLR start "ruleXFunctionTypeRef"
+    // InternalGridSource.g:738:1: ruleXFunctionTypeRef : ( ( rule__XFunctionTypeRef__Group__0 ) ) ;
+    public final void ruleXFunctionTypeRef() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:742:2: ( ( ( rule__XFunctionTypeRef__Group__0 ) ) )
+            // InternalGridSource.g:743:2: ( ( rule__XFunctionTypeRef__Group__0 ) )
+            {
+            // InternalGridSource.g:743:2: ( ( rule__XFunctionTypeRef__Group__0 ) )
+            // InternalGridSource.g:744:3: ( rule__XFunctionTypeRef__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
+            }
+            // InternalGridSource.g:745:3: ( rule__XFunctionTypeRef__Group__0 )
+            // InternalGridSource.g:745:4: rule__XFunctionTypeRef__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXFunctionTypeRef"
+
+
+    // $ANTLR start "entryRuleJvmParameterizedTypeReference"
+    // InternalGridSource.g:754:1: entryRuleJvmParameterizedTypeReference : ruleJvmParameterizedTypeReference EOF ;
+    public final void entryRuleJvmParameterizedTypeReference() throws RecognitionException {
+        try {
+            // InternalGridSource.g:755:1: ( ruleJvmParameterizedTypeReference EOF )
+            // InternalGridSource.g:756:1: ruleJvmParameterizedTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmParameterizedTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmParameterizedTypeReference"
+
+
+    // $ANTLR start "ruleJvmParameterizedTypeReference"
+    // InternalGridSource.g:763:1: ruleJvmParameterizedTypeReference : ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) ;
+    public final void ruleJvmParameterizedTypeReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:767:2: ( ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) )
+            // InternalGridSource.g:768:2: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
+            {
+            // InternalGridSource.g:768:2: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
+            // InternalGridSource.g:769:3: ( rule__JvmParameterizedTypeReference__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
+            }
+            // InternalGridSource.g:770:3: ( rule__JvmParameterizedTypeReference__Group__0 )
+            // InternalGridSource.g:770:4: rule__JvmParameterizedTypeReference__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmParameterizedTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmArgumentTypeReference"
+    // InternalGridSource.g:779:1: entryRuleJvmArgumentTypeReference : ruleJvmArgumentTypeReference EOF ;
+    public final void entryRuleJvmArgumentTypeReference() throws RecognitionException {
+        try {
+            // InternalGridSource.g:780:1: ( ruleJvmArgumentTypeReference EOF )
+            // InternalGridSource.g:781:1: ruleJvmArgumentTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmArgumentTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmArgumentTypeReferenceRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmArgumentTypeReference"
+
+
+    // $ANTLR start "ruleJvmArgumentTypeReference"
+    // InternalGridSource.g:788:1: ruleJvmArgumentTypeReference : ( ( rule__JvmArgumentTypeReference__Alternatives ) ) ;
+    public final void ruleJvmArgumentTypeReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:792:2: ( ( ( rule__JvmArgumentTypeReference__Alternatives ) ) )
+            // InternalGridSource.g:793:2: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
+            {
+            // InternalGridSource.g:793:2: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
+            // InternalGridSource.g:794:3: ( rule__JvmArgumentTypeReference__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
+            }
+            // InternalGridSource.g:795:3: ( rule__JvmArgumentTypeReference__Alternatives )
+            // InternalGridSource.g:795:4: rule__JvmArgumentTypeReference__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmArgumentTypeReference__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmArgumentTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmWildcardTypeReference"
+    // InternalGridSource.g:804:1: entryRuleJvmWildcardTypeReference : ruleJvmWildcardTypeReference EOF ;
+    public final void entryRuleJvmWildcardTypeReference() throws RecognitionException {
+        try {
+            // InternalGridSource.g:805:1: ( ruleJvmWildcardTypeReference EOF )
+            // InternalGridSource.g:806:1: ruleJvmWildcardTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmWildcardTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmWildcardTypeReference"
+
+
+    // $ANTLR start "ruleJvmWildcardTypeReference"
+    // InternalGridSource.g:813:1: ruleJvmWildcardTypeReference : ( ( rule__JvmWildcardTypeReference__Group__0 ) ) ;
+    public final void ruleJvmWildcardTypeReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:817:2: ( ( ( rule__JvmWildcardTypeReference__Group__0 ) ) )
+            // InternalGridSource.g:818:2: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
+            {
+            // InternalGridSource.g:818:2: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
+            // InternalGridSource.g:819:3: ( rule__JvmWildcardTypeReference__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
+            }
+            // InternalGridSource.g:820:3: ( rule__JvmWildcardTypeReference__Group__0 )
+            // InternalGridSource.g:820:4: rule__JvmWildcardTypeReference__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmWildcardTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmUpperBound"
+    // InternalGridSource.g:829:1: entryRuleJvmUpperBound : ruleJvmUpperBound EOF ;
+    public final void entryRuleJvmUpperBound() throws RecognitionException {
+        try {
+            // InternalGridSource.g:830:1: ( ruleJvmUpperBound EOF )
+            // InternalGridSource.g:831:1: ruleJvmUpperBound EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmUpperBound();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmUpperBound"
+
+
+    // $ANTLR start "ruleJvmUpperBound"
+    // InternalGridSource.g:838:1: ruleJvmUpperBound : ( ( rule__JvmUpperBound__Group__0 ) ) ;
+    public final void ruleJvmUpperBound() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:842:2: ( ( ( rule__JvmUpperBound__Group__0 ) ) )
+            // InternalGridSource.g:843:2: ( ( rule__JvmUpperBound__Group__0 ) )
+            {
+            // InternalGridSource.g:843:2: ( ( rule__JvmUpperBound__Group__0 ) )
+            // InternalGridSource.g:844:3: ( rule__JvmUpperBound__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
+            }
+            // InternalGridSource.g:845:3: ( rule__JvmUpperBound__Group__0 )
+            // InternalGridSource.g:845:4: rule__JvmUpperBound__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBound__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmUpperBound"
+
+
+    // $ANTLR start "entryRuleJvmUpperBoundAnded"
+    // InternalGridSource.g:854:1: entryRuleJvmUpperBoundAnded : ruleJvmUpperBoundAnded EOF ;
+    public final void entryRuleJvmUpperBoundAnded() throws RecognitionException {
+        try {
+            // InternalGridSource.g:855:1: ( ruleJvmUpperBoundAnded EOF )
+            // InternalGridSource.g:856:1: ruleJvmUpperBoundAnded EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAndedRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmUpperBoundAnded();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAndedRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmUpperBoundAnded"
+
+
+    // $ANTLR start "ruleJvmUpperBoundAnded"
+    // InternalGridSource.g:863:1: ruleJvmUpperBoundAnded : ( ( rule__JvmUpperBoundAnded__Group__0 ) ) ;
+    public final void ruleJvmUpperBoundAnded() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:867:2: ( ( ( rule__JvmUpperBoundAnded__Group__0 ) ) )
+            // InternalGridSource.g:868:2: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
+            {
+            // InternalGridSource.g:868:2: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
+            // InternalGridSource.g:869:3: ( rule__JvmUpperBoundAnded__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
+            }
+            // InternalGridSource.g:870:3: ( rule__JvmUpperBoundAnded__Group__0 )
+            // InternalGridSource.g:870:4: rule__JvmUpperBoundAnded__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBoundAnded__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmUpperBoundAnded"
+
+
+    // $ANTLR start "entryRuleJvmLowerBound"
+    // InternalGridSource.g:879:1: entryRuleJvmLowerBound : ruleJvmLowerBound EOF ;
+    public final void entryRuleJvmLowerBound() throws RecognitionException {
+        try {
+            // InternalGridSource.g:880:1: ( ruleJvmLowerBound EOF )
+            // InternalGridSource.g:881:1: ruleJvmLowerBound EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmLowerBound();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmLowerBound"
+
+
+    // $ANTLR start "ruleJvmLowerBound"
+    // InternalGridSource.g:888:1: ruleJvmLowerBound : ( ( rule__JvmLowerBound__Group__0 ) ) ;
+    public final void ruleJvmLowerBound() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:892:2: ( ( ( rule__JvmLowerBound__Group__0 ) ) )
+            // InternalGridSource.g:893:2: ( ( rule__JvmLowerBound__Group__0 ) )
+            {
+            // InternalGridSource.g:893:2: ( ( rule__JvmLowerBound__Group__0 ) )
+            // InternalGridSource.g:894:3: ( rule__JvmLowerBound__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
+            }
+            // InternalGridSource.g:895:3: ( rule__JvmLowerBound__Group__0 )
+            // InternalGridSource.g:895:4: rule__JvmLowerBound__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBound__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmLowerBound"
+
+
+    // $ANTLR start "entryRuleJvmLowerBoundAnded"
+    // InternalGridSource.g:904:1: entryRuleJvmLowerBoundAnded : ruleJvmLowerBoundAnded EOF ;
+    public final void entryRuleJvmLowerBoundAnded() throws RecognitionException {
+        try {
+            // InternalGridSource.g:905:1: ( ruleJvmLowerBoundAnded EOF )
+            // InternalGridSource.g:906:1: ruleJvmLowerBoundAnded EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAndedRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleJvmLowerBoundAnded();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAndedRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmLowerBoundAnded"
+
+
+    // $ANTLR start "ruleJvmLowerBoundAnded"
+    // InternalGridSource.g:913:1: ruleJvmLowerBoundAnded : ( ( rule__JvmLowerBoundAnded__Group__0 ) ) ;
+    public final void ruleJvmLowerBoundAnded() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:917:2: ( ( ( rule__JvmLowerBoundAnded__Group__0 ) ) )
+            // InternalGridSource.g:918:2: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
+            {
+            // InternalGridSource.g:918:2: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
+            // InternalGridSource.g:919:3: ( rule__JvmLowerBoundAnded__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
+            }
+            // InternalGridSource.g:920:3: ( rule__JvmLowerBoundAnded__Group__0 )
+            // InternalGridSource.g:920:4: rule__JvmLowerBoundAnded__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBoundAnded__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmLowerBoundAnded"
+
+
+    // $ANTLR start "entryRuleQualifiedNameWithWildcard"
+    // InternalGridSource.g:929:1: entryRuleQualifiedNameWithWildcard : ruleQualifiedNameWithWildcard EOF ;
+    public final void entryRuleQualifiedNameWithWildcard() throws RecognitionException {
+        try {
+            // InternalGridSource.g:930:1: ( ruleQualifiedNameWithWildcard EOF )
+            // InternalGridSource.g:931:1: ruleQualifiedNameWithWildcard EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameWithWildcardRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleQualifiedNameWithWildcard();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameWithWildcardRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleQualifiedNameWithWildcard"
+
+
+    // $ANTLR start "ruleQualifiedNameWithWildcard"
+    // InternalGridSource.g:938:1: ruleQualifiedNameWithWildcard : ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) ;
+    public final void ruleQualifiedNameWithWildcard() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:942:2: ( ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) )
+            // InternalGridSource.g:943:2: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
+            {
+            // InternalGridSource.g:943:2: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
+            // InternalGridSource.g:944:3: ( rule__QualifiedNameWithWildcard__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
+            }
+            // InternalGridSource.g:945:3: ( rule__QualifiedNameWithWildcard__Group__0 )
+            // InternalGridSource.g:945:4: rule__QualifiedNameWithWildcard__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__QualifiedNameWithWildcard__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleQualifiedNameWithWildcard"
+
+
+    // $ANTLR start "entryRuleXImportDeclaration"
+    // InternalGridSource.g:954:1: entryRuleXImportDeclaration : ruleXImportDeclaration EOF ;
+    public final void entryRuleXImportDeclaration() throws RecognitionException {
+        try {
+            // InternalGridSource.g:955:1: ( ruleXImportDeclaration EOF )
+            // InternalGridSource.g:956:1: ruleXImportDeclaration EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleXImportDeclaration();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXImportDeclaration"
+
+
+    // $ANTLR start "ruleXImportDeclaration"
+    // InternalGridSource.g:963:1: ruleXImportDeclaration : ( ( rule__XImportDeclaration__Group__0 ) ) ;
+    public final void ruleXImportDeclaration() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:967:2: ( ( ( rule__XImportDeclaration__Group__0 ) ) )
+            // InternalGridSource.g:968:2: ( ( rule__XImportDeclaration__Group__0 ) )
+            {
+            // InternalGridSource.g:968:2: ( ( rule__XImportDeclaration__Group__0 ) )
+            // InternalGridSource.g:969:3: ( rule__XImportDeclaration__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getGroup()); 
+            }
+            // InternalGridSource.g:970:3: ( rule__XImportDeclaration__Group__0 )
+            // InternalGridSource.g:970:4: rule__XImportDeclaration__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXImportDeclaration"
+
+
+    // $ANTLR start "entryRuleQualifiedNameInStaticImport"
+    // InternalGridSource.g:979:1: entryRuleQualifiedNameInStaticImport : ruleQualifiedNameInStaticImport EOF ;
+    public final void entryRuleQualifiedNameInStaticImport() throws RecognitionException {
+        try {
+            // InternalGridSource.g:980:1: ( ruleQualifiedNameInStaticImport EOF )
+            // InternalGridSource.g:981:1: ruleQualifiedNameInStaticImport EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameInStaticImportRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleQualifiedNameInStaticImport();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameInStaticImportRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleQualifiedNameInStaticImport"
+
+
+    // $ANTLR start "ruleQualifiedNameInStaticImport"
+    // InternalGridSource.g:988:1: ruleQualifiedNameInStaticImport : ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) ;
+    public final void ruleQualifiedNameInStaticImport() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:992:2: ( ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) )
+            // InternalGridSource.g:993:2: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
+            {
+            // InternalGridSource.g:993:2: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
+            // InternalGridSource.g:994:3: ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
+            {
+            // InternalGridSource.g:994:3: ( ( rule__QualifiedNameInStaticImport__Group__0 ) )
+            // InternalGridSource.g:995:4: ( rule__QualifiedNameInStaticImport__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
+            }
+            // InternalGridSource.g:996:4: ( rule__QualifiedNameInStaticImport__Group__0 )
+            // InternalGridSource.g:996:5: rule__QualifiedNameInStaticImport__Group__0
+            {
+            pushFollow(FOLLOW_3);
+            rule__QualifiedNameInStaticImport__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
+            }
+
+            }
+
+            // InternalGridSource.g:999:3: ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
+            // InternalGridSource.g:1000:4: ( rule__QualifiedNameInStaticImport__Group__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
+            }
+            // InternalGridSource.g:1001:4: ( rule__QualifiedNameInStaticImport__Group__0 )*
+            loop1:
+            do {
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( (LA1_0==RULE_ID) ) {
+                    int LA1_2 = input.LA(2);
+
+                    if ( (LA1_2==34) ) {
+                        alt1=1;
+                    }
+
+
+                }
+
+
+                switch (alt1) {
+            	case 1 :
+            	    // InternalGridSource.g:1001:5: rule__QualifiedNameInStaticImport__Group__0
+            	    {
+            	    pushFollow(FOLLOW_3);
+            	    rule__QualifiedNameInStaticImport__Group__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop1;
+                }
+            } 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 "ruleStyleCompare"
+    // InternalGridSource.g:1011:1: ruleStyleCompare : ( ( rule__StyleCompare__Alternatives ) ) ;
+    public final void ruleStyleCompare() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1015:1: ( ( ( rule__StyleCompare__Alternatives ) ) )
+            // InternalGridSource.g:1016:2: ( ( rule__StyleCompare__Alternatives ) )
+            {
+            // InternalGridSource.g:1016:2: ( ( rule__StyleCompare__Alternatives ) )
+            // InternalGridSource.g:1017:3: ( rule__StyleCompare__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStyleCompareAccess().getAlternatives()); 
+            }
+            // InternalGridSource.g:1018:3: ( rule__StyleCompare__Alternatives )
+            // InternalGridSource.g:1018:4: rule__StyleCompare__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__StyleCompare__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStyleCompareAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleStyleCompare"
+
+
+    // $ANTLR start "rule__PropertyStyle__Alternatives"
+    // InternalGridSource.g:1026:1: rule__PropertyStyle__Alternatives : ( ( rulePropertyButtonStyle ) | ( rulePropertyHtmlStyle ) | ( rulePropertyProgressbarStyle ) | ( rulePropertyTextStyle ) | ( rulePropertyBooleanStyle ) | ( rulePropertyDateStyle ) | ( rulePropertyNumberStyle ) | ( rulePropertyImageStyle ) | ( rulePropertyQuantityStyle ) | ( rulePropertyPriceStyle ) | ( ruleGridPropIndicatorStyle ) );
+    public final void rule__PropertyStyle__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1030:1: ( ( rulePropertyButtonStyle ) | ( rulePropertyHtmlStyle ) | ( rulePropertyProgressbarStyle ) | ( rulePropertyTextStyle ) | ( rulePropertyBooleanStyle ) | ( rulePropertyDateStyle ) | ( rulePropertyNumberStyle ) | ( rulePropertyImageStyle ) | ( rulePropertyQuantityStyle ) | ( rulePropertyPriceStyle ) | ( ruleGridPropIndicatorStyle ) )
+            int alt2=11;
+            switch ( input.LA(1) ) {
+            case 35:
+                {
+                alt2=1;
+                }
+                break;
+            case 37:
+                {
+                alt2=2;
+                }
+                break;
+            case 42:
+                {
+                alt2=3;
+                }
+                break;
+            case 54:
+                {
+                alt2=4;
+                }
+                break;
+            case 38:
+                {
+                alt2=5;
+                }
+                break;
+            case 39:
+                {
+                alt2=6;
+                }
+                break;
+            case 41:
+                {
+                alt2=7;
+                }
+                break;
+            case 55:
+                {
+                alt2=8;
+                }
+                break;
+            case 47:
+                {
+                alt2=9;
+                }
+                break;
+            case 52:
+                {
+                alt2=10;
+                }
+                break;
+            case 44:
+                {
+                alt2=11;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 2, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt2) {
+                case 1 :
+                    // InternalGridSource.g:1031:2: ( rulePropertyButtonStyle )
+                    {
+                    // InternalGridSource.g:1031:2: ( rulePropertyButtonStyle )
+                    // InternalGridSource.g:1032:3: rulePropertyButtonStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyButtonStyleParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyButtonStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyButtonStyleParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalGridSource.g:1037:2: ( rulePropertyHtmlStyle )
+                    {
+                    // InternalGridSource.g:1037:2: ( rulePropertyHtmlStyle )
+                    // InternalGridSource.g:1038:3: rulePropertyHtmlStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyHtmlStyleParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyHtmlStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyHtmlStyleParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalGridSource.g:1043:2: ( rulePropertyProgressbarStyle )
+                    {
+                    // InternalGridSource.g:1043:2: ( rulePropertyProgressbarStyle )
+                    // InternalGridSource.g:1044:3: rulePropertyProgressbarStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyProgressbarStyleParserRuleCall_2()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyProgressbarStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyProgressbarStyleParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalGridSource.g:1049:2: ( rulePropertyTextStyle )
+                    {
+                    // InternalGridSource.g:1049:2: ( rulePropertyTextStyle )
+                    // InternalGridSource.g:1050:3: rulePropertyTextStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyTextStyleParserRuleCall_3()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyTextStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyTextStyleParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalGridSource.g:1055:2: ( rulePropertyBooleanStyle )
+                    {
+                    // InternalGridSource.g:1055:2: ( rulePropertyBooleanStyle )
+                    // InternalGridSource.g:1056:3: rulePropertyBooleanStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyBooleanStyleParserRuleCall_4()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyBooleanStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyBooleanStyleParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalGridSource.g:1061:2: ( rulePropertyDateStyle )
+                    {
+                    // InternalGridSource.g:1061:2: ( rulePropertyDateStyle )
+                    // InternalGridSource.g:1062:3: rulePropertyDateStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyDateStyleParserRuleCall_5()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyDateStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyDateStyleParserRuleCall_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // InternalGridSource.g:1067:2: ( rulePropertyNumberStyle )
+                    {
+                    // InternalGridSource.g:1067:2: ( rulePropertyNumberStyle )
+                    // InternalGridSource.g:1068:3: rulePropertyNumberStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyNumberStyleParserRuleCall_6()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyNumberStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyNumberStyleParserRuleCall_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // InternalGridSource.g:1073:2: ( rulePropertyImageStyle )
+                    {
+                    // InternalGridSource.g:1073:2: ( rulePropertyImageStyle )
+                    // InternalGridSource.g:1074:3: rulePropertyImageStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyImageStyleParserRuleCall_7()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyImageStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyImageStyleParserRuleCall_7()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // InternalGridSource.g:1079:2: ( rulePropertyQuantityStyle )
+                    {
+                    // InternalGridSource.g:1079:2: ( rulePropertyQuantityStyle )
+                    // InternalGridSource.g:1080:3: rulePropertyQuantityStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyQuantityStyleParserRuleCall_8()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyQuantityStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyQuantityStyleParserRuleCall_8()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 10 :
+                    // InternalGridSource.g:1085:2: ( rulePropertyPriceStyle )
+                    {
+                    // InternalGridSource.g:1085:2: ( rulePropertyPriceStyle )
+                    // InternalGridSource.g:1086:3: rulePropertyPriceStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyPriceStyleParserRuleCall_9()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    rulePropertyPriceStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyPriceStyleParserRuleCall_9()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 11 :
+                    // InternalGridSource.g:1091:2: ( ruleGridPropIndicatorStyle )
+                    {
+                    // InternalGridSource.g:1091:2: ( ruleGridPropIndicatorStyle )
+                    // InternalGridSource.g:1092:3: ruleGridPropIndicatorStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getGridPropIndicatorStyleParserRuleCall_10()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleGridPropIndicatorStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getGridPropIndicatorStyleParserRuleCall_10()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyStyle__Alternatives"
+
+
+    // $ANTLR start "rule__StyleConfig__Alternatives"
+    // InternalGridSource.g:1101:1: rule__StyleConfig__Alternatives : ( ( ruleNumericToResourceStyleConfig ) | ( ruleStringToResourceStyleConfig ) );
+    public final void rule__StyleConfig__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1105:1: ( ( ruleNumericToResourceStyleConfig ) | ( ruleStringToResourceStyleConfig ) )
+            int alt3=2;
+            int LA3_0 = input.LA(1);
+
+            if ( (LA3_0==56) ) {
+                alt3=1;
+            }
+            else if ( (LA3_0==58) ) {
+                alt3=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 3, 0, input);
+
+                throw nvae;
+            }
+            switch (alt3) {
+                case 1 :
+                    // InternalGridSource.g:1106:2: ( ruleNumericToResourceStyleConfig )
+                    {
+                    // InternalGridSource.g:1106:2: ( ruleNumericToResourceStyleConfig )
+                    // InternalGridSource.g:1107:3: ruleNumericToResourceStyleConfig
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleConfigAccess().getNumericToResourceStyleConfigParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleNumericToResourceStyleConfig();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStyleConfigAccess().getNumericToResourceStyleConfigParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalGridSource.g:1112:2: ( ruleStringToResourceStyleConfig )
+                    {
+                    // InternalGridSource.g:1112:2: ( ruleStringToResourceStyleConfig )
+                    // InternalGridSource.g:1113:3: ruleStringToResourceStyleConfig
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleConfigAccess().getStringToResourceStyleConfigParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleStringToResourceStyleConfig();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStyleConfigAccess().getStringToResourceStyleConfigParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StyleConfig__Alternatives"
+
+
+    // $ANTLR start "rule__LInt__Alternatives_0"
+    // InternalGridSource.g:1122:1: rule__LInt__Alternatives_0 : ( ( '+' ) | ( '-' ) );
+    public final void rule__LInt__Alternatives_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1126:1: ( ( '+' ) | ( '-' ) )
+            int alt4=2;
+            int LA4_0 = input.LA(1);
+
+            if ( (LA4_0==13) ) {
+                alt4=1;
+            }
+            else if ( (LA4_0==14) ) {
+                alt4=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 4, 0, input);
+
+                throw nvae;
+            }
+            switch (alt4) {
+                case 1 :
+                    // InternalGridSource.g:1127:2: ( '+' )
+                    {
+                    // InternalGridSource.g:1127:2: ( '+' )
+                    // InternalGridSource.g:1128:3: '+'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLIntAccess().getPlusSignKeyword_0_0()); 
+                    }
+                    match(input,13,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLIntAccess().getPlusSignKeyword_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalGridSource.g:1133:2: ( '-' )
+                    {
+                    // InternalGridSource.g:1133:2: ( '-' )
+                    // InternalGridSource.g:1134:3: '-'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLIntAccess().getHyphenMinusKeyword_0_1()); 
+                    }
+                    match(input,14,FOLLOW_2); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLIntAccess().getHyphenMinusKeyword_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LInt__Alternatives_0"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Alternatives"
+    // InternalGridSource.g:1143:1: rule__JvmTypeReference__Alternatives : ( ( ( rule__JvmTypeReference__Group_0__0 ) ) | ( ruleXFunctionTypeRef ) );
+    public final void rule__JvmTypeReference__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1147:1: ( ( ( rule__JvmTypeReference__Group_0__0 ) ) | ( ruleXFunctionTypeRef ) )
+            int alt5=2;
+            int LA5_0 = input.LA(1);
+
+            if ( (LA5_0==RULE_ID) ) {
+                alt5=1;
+            }
+            else if ( (LA5_0==50||LA5_0==61) ) {
+                alt5=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 5, 0, input);
+
+                throw nvae;
+            }
+            switch (alt5) {
+                case 1 :
+                    // InternalGridSource.g:1148:2: ( ( rule__JvmTypeReference__Group_0__0 ) )
+                    {
+                    // InternalGridSource.g:1148:2: ( ( rule__JvmTypeReference__Group_0__0 ) )
+                    // InternalGridSource.g:1149:3: ( rule__JvmTypeReference__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); 
+                    }
+                    // InternalGridSource.g:1150:3: ( rule__JvmTypeReference__Group_0__0 )
+                    // InternalGridSource.g:1150:4: rule__JvmTypeReference__Group_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__JvmTypeReference__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalGridSource.g:1154:2: ( ruleXFunctionTypeRef )
+                    {
+                    // InternalGridSource.g:1154:2: ( ruleXFunctionTypeRef )
+                    // InternalGridSource.g:1155:3: ruleXFunctionTypeRef
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleXFunctionTypeRef();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Alternatives"
+
+
+    // $ANTLR start "rule__JvmArgumentTypeReference__Alternatives"
+    // InternalGridSource.g:1164:1: rule__JvmArgumentTypeReference__Alternatives : ( ( ruleJvmTypeReference ) | ( ruleJvmWildcardTypeReference ) );
+    public final void rule__JvmArgumentTypeReference__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1168:1: ( ( ruleJvmTypeReference ) | ( ruleJvmWildcardTypeReference ) )
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+
+            if ( (LA6_0==RULE_ID||LA6_0==50||LA6_0==61) ) {
+                alt6=1;
+            }
+            else if ( (LA6_0==65) ) {
+                alt6=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 6, 0, input);
+
+                throw nvae;
+            }
+            switch (alt6) {
+                case 1 :
+                    // InternalGridSource.g:1169:2: ( ruleJvmTypeReference )
+                    {
+                    // InternalGridSource.g:1169:2: ( ruleJvmTypeReference )
+                    // InternalGridSource.g:1170:3: ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleJvmTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalGridSource.g:1175:2: ( ruleJvmWildcardTypeReference )
+                    {
+                    // InternalGridSource.g:1175:2: ( ruleJvmWildcardTypeReference )
+                    // InternalGridSource.g:1176:3: ruleJvmWildcardTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleJvmWildcardTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmArgumentTypeReference__Alternatives"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Alternatives_2"
+    // InternalGridSource.g:1185:1: rule__JvmWildcardTypeReference__Alternatives_2 : ( ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) ) | ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) ) );
+    public final void rule__JvmWildcardTypeReference__Alternatives_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1189:1: ( ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) ) | ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) ) )
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0==66) ) {
+                alt7=1;
+            }
+            else if ( (LA7_0==68) ) {
+                alt7=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 7, 0, input);
+
+                throw nvae;
+            }
+            switch (alt7) {
+                case 1 :
+                    // InternalGridSource.g:1190:2: ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) )
+                    {
+                    // InternalGridSource.g:1190:2: ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) )
+                    // InternalGridSource.g:1191:3: ( rule__JvmWildcardTypeReference__Group_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); 
+                    }
+                    // InternalGridSource.g:1192:3: ( rule__JvmWildcardTypeReference__Group_2_0__0 )
+                    // InternalGridSource.g:1192:4: rule__JvmWildcardTypeReference__Group_2_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__JvmWildcardTypeReference__Group_2_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalGridSource.g:1196:2: ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) )
+                    {
+                    // InternalGridSource.g:1196:2: ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) )
+                    // InternalGridSource.g:1197:3: ( rule__JvmWildcardTypeReference__Group_2_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); 
+                    }
+                    // InternalGridSource.g:1198:3: ( rule__JvmWildcardTypeReference__Group_2_1__0 )
+                    // InternalGridSource.g:1198:4: rule__JvmWildcardTypeReference__Group_2_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__JvmWildcardTypeReference__Group_2_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Alternatives_2"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Alternatives_1"
+    // InternalGridSource.g:1206:1: rule__XImportDeclaration__Alternatives_1 : ( ( ( rule__XImportDeclaration__Group_1_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_1_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_1_2 ) ) );
+    public final void rule__XImportDeclaration__Alternatives_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1210:1: ( ( ( rule__XImportDeclaration__Group_1_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_1_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_1_2 ) ) )
+            int alt8=3;
+            alt8 = dfa8.predict(input);
+            switch (alt8) {
+                case 1 :
+                    // InternalGridSource.g:1211:2: ( ( rule__XImportDeclaration__Group_1_0__0 ) )
+                    {
+                    // InternalGridSource.g:1211:2: ( ( rule__XImportDeclaration__Group_1_0__0 ) )
+                    // InternalGridSource.g:1212:3: ( rule__XImportDeclaration__Group_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); 
+                    }
+                    // InternalGridSource.g:1213:3: ( rule__XImportDeclaration__Group_1_0__0 )
+                    // InternalGridSource.g:1213:4: rule__XImportDeclaration__Group_1_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XImportDeclaration__Group_1_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalGridSource.g:1217:2: ( ( rule__XImportDeclaration__ImportedTypeAssignment_1_1 ) )
+                    {
+                    // InternalGridSource.g:1217:2: ( ( rule__XImportDeclaration__ImportedTypeAssignment_1_1 ) )
+                    // InternalGridSource.g:1218:3: ( rule__XImportDeclaration__ImportedTypeAssignment_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1()); 
+                    }
+                    // InternalGridSource.g:1219:3: ( rule__XImportDeclaration__ImportedTypeAssignment_1_1 )
+                    // InternalGridSource.g:1219:4: rule__XImportDeclaration__ImportedTypeAssignment_1_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XImportDeclaration__ImportedTypeAssignment_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalGridSource.g:1223:2: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_1_2 ) )
+                    {
+                    // InternalGridSource.g:1223:2: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_1_2 ) )
+                    // InternalGridSource.g:1224:3: ( rule__XImportDeclaration__ImportedNamespaceAssignment_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2()); 
+                    }
+                    // InternalGridSource.g:1225:3: ( rule__XImportDeclaration__ImportedNamespaceAssignment_1_2 )
+                    // InternalGridSource.g:1225:4: rule__XImportDeclaration__ImportedNamespaceAssignment_1_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XImportDeclaration__ImportedNamespaceAssignment_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Alternatives_1"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Alternatives_1_0_3"
+    // InternalGridSource.g:1233:1: rule__XImportDeclaration__Alternatives_1_0_3 : ( ( ( rule__XImportDeclaration__WildcardAssignment_1_0_3_0 ) ) | ( ( rule__XImportDeclaration__MemberNameAssignment_1_0_3_1 ) ) );
+    public final void rule__XImportDeclaration__Alternatives_1_0_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1237:1: ( ( ( rule__XImportDeclaration__WildcardAssignment_1_0_3_0 ) ) | ( ( rule__XImportDeclaration__MemberNameAssignment_1_0_3_1 ) ) )
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0==69) ) {
+                alt9=1;
+            }
+            else if ( (LA9_0==RULE_ID) ) {
+                alt9=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 9, 0, input);
+
+                throw nvae;
+            }
+            switch (alt9) {
+                case 1 :
+                    // InternalGridSource.g:1238:2: ( ( rule__XImportDeclaration__WildcardAssignment_1_0_3_0 ) )
+                    {
+                    // InternalGridSource.g:1238:2: ( ( rule__XImportDeclaration__WildcardAssignment_1_0_3_0 ) )
+                    // InternalGridSource.g:1239:3: ( rule__XImportDeclaration__WildcardAssignment_1_0_3_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0()); 
+                    }
+                    // InternalGridSource.g:1240:3: ( rule__XImportDeclaration__WildcardAssignment_1_0_3_0 )
+                    // InternalGridSource.g:1240:4: rule__XImportDeclaration__WildcardAssignment_1_0_3_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XImportDeclaration__WildcardAssignment_1_0_3_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalGridSource.g:1244:2: ( ( rule__XImportDeclaration__MemberNameAssignment_1_0_3_1 ) )
+                    {
+                    // InternalGridSource.g:1244:2: ( ( rule__XImportDeclaration__MemberNameAssignment_1_0_3_1 ) )
+                    // InternalGridSource.g:1245:3: ( rule__XImportDeclaration__MemberNameAssignment_1_0_3_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1()); 
+                    }
+                    // InternalGridSource.g:1246:3: ( rule__XImportDeclaration__MemberNameAssignment_1_0_3_1 )
+                    // InternalGridSource.g:1246:4: rule__XImportDeclaration__MemberNameAssignment_1_0_3_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XImportDeclaration__MemberNameAssignment_1_0_3_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Alternatives_1_0_3"
+
+
+    // $ANTLR start "rule__StyleCompare__Alternatives"
+    // InternalGridSource.g:1254:1: rule__StyleCompare__Alternatives : ( ( ( 'equal' ) ) | ( ( 'greater equal' ) ) | ( ( 'greater than' ) ) | ( ( 'lower equal' ) ) | ( ( 'lower than' ) ) | ( ( 'not equal' ) ) );
+    public final void rule__StyleCompare__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1258:1: ( ( ( 'equal' ) ) | ( ( 'greater equal' ) ) | ( ( 'greater than' ) ) | ( ( 'lower equal' ) ) | ( ( 'lower than' ) ) | ( ( 'not equal' ) ) )
+            int alt10=6;
+            switch ( input.LA(1) ) {
+            case 15:
+                {
+                alt10=1;
+                }
+                break;
+            case 16:
+                {
+                alt10=2;
+                }
+                break;
+            case 17:
+                {
+                alt10=3;
+                }
+                break;
+            case 18:
+                {
+                alt10=4;
+                }
+                break;
+            case 19:
+                {
+                alt10=5;
+                }
+                break;
+            case 20:
+                {
+                alt10=6;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 10, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt10) {
+                case 1 :
+                    // InternalGridSource.g:1259:2: ( ( 'equal' ) )
+                    {
+                    // InternalGridSource.g:1259:2: ( ( 'equal' ) )
+                    // InternalGridSource.g:1260:3: ( 'equal' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0()); 
+                    }
+                    // InternalGridSource.g:1261:3: ( 'equal' )
+                    // InternalGridSource.g:1261:4: 'equal'
+                    {
+                    match(input,15,FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalGridSource.g:1265:2: ( ( 'greater equal' ) )
+                    {
+                    // InternalGridSource.g:1265:2: ( ( 'greater equal' ) )
+                    // InternalGridSource.g:1266:3: ( 'greater equal' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1()); 
+                    }
+                    // InternalGridSource.g:1267:3: ( 'greater equal' )
+                    // InternalGridSource.g:1267:4: 'greater equal'
+                    {
+                    match(input,16,FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalGridSource.g:1271:2: ( ( 'greater than' ) )
+                    {
+                    // InternalGridSource.g:1271:2: ( ( 'greater than' ) )
+                    // InternalGridSource.g:1272:3: ( 'greater than' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2()); 
+                    }
+                    // InternalGridSource.g:1273:3: ( 'greater than' )
+                    // InternalGridSource.g:1273:4: 'greater than'
+                    {
+                    match(input,17,FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalGridSource.g:1277:2: ( ( 'lower equal' ) )
+                    {
+                    // InternalGridSource.g:1277:2: ( ( 'lower equal' ) )
+                    // InternalGridSource.g:1278:3: ( 'lower equal' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3()); 
+                    }
+                    // InternalGridSource.g:1279:3: ( 'lower equal' )
+                    // InternalGridSource.g:1279:4: 'lower equal'
+                    {
+                    match(input,18,FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalGridSource.g:1283:2: ( ( 'lower than' ) )
+                    {
+                    // InternalGridSource.g:1283:2: ( ( 'lower than' ) )
+                    // InternalGridSource.g:1284:3: ( 'lower than' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4()); 
+                    }
+                    // InternalGridSource.g:1285:3: ( 'lower than' )
+                    // InternalGridSource.g:1285:4: 'lower than'
+                    {
+                    match(input,19,FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // InternalGridSource.g:1289:2: ( ( 'not equal' ) )
+                    {
+                    // InternalGridSource.g:1289:2: ( ( 'not equal' ) )
+                    // InternalGridSource.g:1290:3: ( 'not equal' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5()); 
+                    }
+                    // InternalGridSource.g:1291:3: ( 'not equal' )
+                    // InternalGridSource.g:1291:4: 'not equal'
+                    {
+                    match(input,20,FOLLOW_2); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StyleCompare__Alternatives"
+
+
+    // $ANTLR start "rule__Source__Group__0"
+    // InternalGridSource.g:1299:1: rule__Source__Group__0 : rule__Source__Group__0__Impl rule__Source__Group__1 ;
+    public final void rule__Source__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1303:1: ( rule__Source__Group__0__Impl rule__Source__Group__1 )
+            // InternalGridSource.g:1304:2: rule__Source__Group__0__Impl rule__Source__Group__1
+            {
+            pushFollow(FOLLOW_4);
+            rule__Source__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Source__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__0"
+
+
+    // $ANTLR start "rule__Source__Group__0__Impl"
+    // InternalGridSource.g:1311:1: rule__Source__Group__0__Impl : ( 'gridsource' ) ;
+    public final void rule__Source__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1315:1: ( ( 'gridsource' ) )
+            // InternalGridSource.g:1316:1: ( 'gridsource' )
+            {
+            // InternalGridSource.g:1316:1: ( 'gridsource' )
+            // InternalGridSource.g:1317:2: 'gridsource'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getGridsourceKeyword_0()); 
+            }
+            match(input,21,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getGridsourceKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Source__Group__1"
+    // InternalGridSource.g:1326:1: rule__Source__Group__1 : rule__Source__Group__1__Impl rule__Source__Group__2 ;
+    public final void rule__Source__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1330:1: ( rule__Source__Group__1__Impl rule__Source__Group__2 )
+            // InternalGridSource.g:1331:2: rule__Source__Group__1__Impl rule__Source__Group__2
+            {
+            pushFollow(FOLLOW_5);
+            rule__Source__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Source__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__1"
+
+
+    // $ANTLR start "rule__Source__Group__1__Impl"
+    // InternalGridSource.g:1338:1: rule__Source__Group__1__Impl : ( ( rule__Source__IdAssignment_1 ) ) ;
+    public final void rule__Source__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1342:1: ( ( ( rule__Source__IdAssignment_1 ) ) )
+            // InternalGridSource.g:1343:1: ( ( rule__Source__IdAssignment_1 ) )
+            {
+            // InternalGridSource.g:1343:1: ( ( rule__Source__IdAssignment_1 ) )
+            // InternalGridSource.g:1344:2: ( rule__Source__IdAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getIdAssignment_1()); 
+            }
+            // InternalGridSource.g:1345:2: ( rule__Source__IdAssignment_1 )
+            // InternalGridSource.g:1345:3: rule__Source__IdAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__Source__IdAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getIdAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Source__Group__2"
+    // InternalGridSource.g:1353:1: rule__Source__Group__2 : rule__Source__Group__2__Impl rule__Source__Group__3 ;
+    public final void rule__Source__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1357:1: ( rule__Source__Group__2__Impl rule__Source__Group__3 )
+            // InternalGridSource.g:1358:2: rule__Source__Group__2__Impl rule__Source__Group__3
+            {
+            pushFollow(FOLLOW_6);
+            rule__Source__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Source__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__2"
+
+
+    // $ANTLR start "rule__Source__Group__2__Impl"
+    // InternalGridSource.g:1365:1: rule__Source__Group__2__Impl : ( 'for' ) ;
+    public final void rule__Source__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1369:1: ( ( 'for' ) )
+            // InternalGridSource.g:1370:1: ( 'for' )
+            {
+            // InternalGridSource.g:1370:1: ( 'for' )
+            // InternalGridSource.g:1371:2: 'for'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getForKeyword_2()); 
+            }
+            match(input,22,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getForKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Source__Group__3"
+    // InternalGridSource.g:1380:1: rule__Source__Group__3 : rule__Source__Group__3__Impl rule__Source__Group__4 ;
+    public final void rule__Source__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1384:1: ( rule__Source__Group__3__Impl rule__Source__Group__4 )
+            // InternalGridSource.g:1385:2: rule__Source__Group__3__Impl rule__Source__Group__4
+            {
+            pushFollow(FOLLOW_7);
+            rule__Source__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Source__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__3"
+
+
+    // $ANTLR start "rule__Source__Group__3__Impl"
+    // InternalGridSource.g:1392:1: rule__Source__Group__3__Impl : ( ( rule__Source__RootTypeAssignment_3 ) ) ;
+    public final void rule__Source__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1396:1: ( ( ( rule__Source__RootTypeAssignment_3 ) ) )
+            // InternalGridSource.g:1397:1: ( ( rule__Source__RootTypeAssignment_3 ) )
+            {
+            // InternalGridSource.g:1397:1: ( ( rule__Source__RootTypeAssignment_3 ) )
+            // InternalGridSource.g:1398:2: ( rule__Source__RootTypeAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getRootTypeAssignment_3()); 
+            }
+            // InternalGridSource.g:1399:2: ( rule__Source__RootTypeAssignment_3 )
+            // InternalGridSource.g:1399:3: rule__Source__RootTypeAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__Source__RootTypeAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getRootTypeAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Source__Group__4"
+    // InternalGridSource.g:1407:1: rule__Source__Group__4 : rule__Source__Group__4__Impl rule__Source__Group__5 ;
+    public final void rule__Source__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1411:1: ( rule__Source__Group__4__Impl rule__Source__Group__5 )
+            // InternalGridSource.g:1412:2: rule__Source__Group__4__Impl rule__Source__Group__5
+            {
+            pushFollow(FOLLOW_8);
+            rule__Source__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Source__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__4"
+
+
+    // $ANTLR start "rule__Source__Group__4__Impl"
+    // InternalGridSource.g:1419:1: rule__Source__Group__4__Impl : ( '{' ) ;
+    public final void rule__Source__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1423:1: ( ( '{' ) )
+            // InternalGridSource.g:1424:1: ( '{' )
+            {
+            // InternalGridSource.g:1424:1: ( '{' )
+            // InternalGridSource.g:1425:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+            match(input,23,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Source__Group__5"
+    // InternalGridSource.g:1434:1: rule__Source__Group__5 : rule__Source__Group__5__Impl rule__Source__Group__6 ;
+    public final void rule__Source__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1438:1: ( rule__Source__Group__5__Impl rule__Source__Group__6 )
+            // InternalGridSource.g:1439:2: rule__Source__Group__5__Impl rule__Source__Group__6
+            {
+            pushFollow(FOLLOW_7);
+            rule__Source__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Source__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__5"
+
+
+    // $ANTLR start "rule__Source__Group__5__Impl"
+    // InternalGridSource.g:1446:1: rule__Source__Group__5__Impl : ( 'inputs' ) ;
+    public final void rule__Source__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1450:1: ( ( 'inputs' ) )
+            // InternalGridSource.g:1451:1: ( 'inputs' )
+            {
+            // InternalGridSource.g:1451:1: ( 'inputs' )
+            // InternalGridSource.g:1452:2: 'inputs'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getInputsKeyword_5()); 
+            }
+            match(input,24,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getInputsKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__5__Impl"
+
+
+    // $ANTLR start "rule__Source__Group__6"
+    // InternalGridSource.g:1461:1: rule__Source__Group__6 : rule__Source__Group__6__Impl rule__Source__Group__7 ;
+    public final void rule__Source__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1465:1: ( rule__Source__Group__6__Impl rule__Source__Group__7 )
+            // InternalGridSource.g:1466:2: rule__Source__Group__6__Impl rule__Source__Group__7
+            {
+            pushFollow(FOLLOW_9);
+            rule__Source__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Source__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__6"
+
+
+    // $ANTLR start "rule__Source__Group__6__Impl"
+    // InternalGridSource.g:1473:1: rule__Source__Group__6__Impl : ( '{' ) ;
+    public final void rule__Source__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1477:1: ( ( '{' ) )
+            // InternalGridSource.g:1478:1: ( '{' )
+            {
+            // InternalGridSource.g:1478:1: ( '{' )
+            // InternalGridSource.g:1479:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+            match(input,23,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__6__Impl"
+
+
+    // $ANTLR start "rule__Source__Group__7"
+    // InternalGridSource.g:1488:1: rule__Source__Group__7 : rule__Source__Group__7__Impl rule__Source__Group__8 ;
+    public final void rule__Source__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1492:1: ( rule__Source__Group__7__Impl rule__Source__Group__8 )
+            // InternalGridSource.g:1493:2: rule__Source__Group__7__Impl rule__Source__Group__8
+            {
+            pushFollow(FOLLOW_9);
+            rule__Source__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Source__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__7"
+
+
+    // $ANTLR start "rule__Source__Group__7__Impl"
+    // InternalGridSource.g:1500:1: rule__Source__Group__7__Impl : ( ( rule__Source__InputsAssignment_7 )* ) ;
+    public final void rule__Source__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1504:1: ( ( ( rule__Source__InputsAssignment_7 )* ) )
+            // InternalGridSource.g:1505:1: ( ( rule__Source__InputsAssignment_7 )* )
+            {
+            // InternalGridSource.g:1505:1: ( ( rule__Source__InputsAssignment_7 )* )
+            // InternalGridSource.g:1506:2: ( rule__Source__InputsAssignment_7 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getInputsAssignment_7()); 
+            }
+            // InternalGridSource.g:1507:2: ( rule__Source__InputsAssignment_7 )*
+            loop11:
+            do {
+                int alt11=2;
+                int LA11_0 = input.LA(1);
+
+                if ( (LA11_0==26) ) {
+                    alt11=1;
+                }
+
+
+                switch (alt11) {
+            	case 1 :
+            	    // InternalGridSource.g:1507:3: rule__Source__InputsAssignment_7
+            	    {
+            	    pushFollow(FOLLOW_10);
+            	    rule__Source__InputsAssignment_7();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop11;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getInputsAssignment_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__7__Impl"
+
+
+    // $ANTLR start "rule__Source__Group__8"
+    // InternalGridSource.g:1515:1: rule__Source__Group__8 : rule__Source__Group__8__Impl rule__Source__Group__9 ;
+    public final void rule__Source__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1519:1: ( rule__Source__Group__8__Impl rule__Source__Group__9 )
+            // InternalGridSource.g:1520:2: rule__Source__Group__8__Impl rule__Source__Group__9
+            {
+            pushFollow(FOLLOW_11);
+            rule__Source__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Source__Group__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__8"
+
+
+    // $ANTLR start "rule__Source__Group__8__Impl"
+    // InternalGridSource.g:1527:1: rule__Source__Group__8__Impl : ( '}' ) ;
+    public final void rule__Source__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1531:1: ( ( '}' ) )
+            // InternalGridSource.g:1532:1: ( '}' )
+            {
+            // InternalGridSource.g:1532:1: ( '}' )
+            // InternalGridSource.g:1533:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_8()); 
+            }
+            match(input,25,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__8__Impl"
+
+
+    // $ANTLR start "rule__Source__Group__9"
+    // InternalGridSource.g:1542:1: rule__Source__Group__9 : rule__Source__Group__9__Impl rule__Source__Group__10 ;
+    public final void rule__Source__Group__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1546:1: ( rule__Source__Group__9__Impl rule__Source__Group__10 )
+            // InternalGridSource.g:1547:2: rule__Source__Group__9__Impl rule__Source__Group__10
+            {
+            pushFollow(FOLLOW_11);
+            rule__Source__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Source__Group__10();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__9"
+
+
+    // $ANTLR start "rule__Source__Group__9__Impl"
+    // InternalGridSource.g:1554:1: rule__Source__Group__9__Impl : ( ( rule__Source__PropertiesAssignment_9 )* ) ;
+    public final void rule__Source__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1558:1: ( ( ( rule__Source__PropertiesAssignment_9 )* ) )
+            // InternalGridSource.g:1559:1: ( ( rule__Source__PropertiesAssignment_9 )* )
+            {
+            // InternalGridSource.g:1559:1: ( ( rule__Source__PropertiesAssignment_9 )* )
+            // InternalGridSource.g:1560:2: ( rule__Source__PropertiesAssignment_9 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getPropertiesAssignment_9()); 
+            }
+            // InternalGridSource.g:1561:2: ( rule__Source__PropertiesAssignment_9 )*
+            loop12:
+            do {
+                int alt12=2;
+                int LA12_0 = input.LA(1);
+
+                if ( (LA12_0==32) ) {
+                    alt12=1;
+                }
+
+
+                switch (alt12) {
+            	case 1 :
+            	    // InternalGridSource.g:1561:3: rule__Source__PropertiesAssignment_9
+            	    {
+            	    pushFollow(FOLLOW_12);
+            	    rule__Source__PropertiesAssignment_9();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop12;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getPropertiesAssignment_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__9__Impl"
+
+
+    // $ANTLR start "rule__Source__Group__10"
+    // InternalGridSource.g:1569:1: rule__Source__Group__10 : rule__Source__Group__10__Impl ;
+    public final void rule__Source__Group__10() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1573:1: ( rule__Source__Group__10__Impl )
+            // InternalGridSource.g:1574:2: rule__Source__Group__10__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__Source__Group__10__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__10"
+
+
+    // $ANTLR start "rule__Source__Group__10__Impl"
+    // InternalGridSource.g:1580:1: rule__Source__Group__10__Impl : ( '}' ) ;
+    public final void rule__Source__Group__10__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1584:1: ( ( '}' ) )
+            // InternalGridSource.g:1585:1: ( '}' )
+            {
+            // InternalGridSource.g:1585:1: ( '}' )
+            // InternalGridSource.g:1586:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_10()); 
+            }
+            match(input,25,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_10()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__Group__10__Impl"
+
+
+    // $ANTLR start "rule__Input__Group__0"
+    // InternalGridSource.g:1596:1: rule__Input__Group__0 : rule__Input__Group__0__Impl rule__Input__Group__1 ;
+    public final void rule__Input__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1600:1: ( rule__Input__Group__0__Impl rule__Input__Group__1 )
+            // InternalGridSource.g:1601:2: rule__Input__Group__0__Impl rule__Input__Group__1
+            {
+            pushFollow(FOLLOW_6);
+            rule__Input__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Input__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__Group__0"
+
+
+    // $ANTLR start "rule__Input__Group__0__Impl"
+    // InternalGridSource.g:1608:1: rule__Input__Group__0__Impl : ( 'inputType' ) ;
+    public final void rule__Input__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1612:1: ( ( 'inputType' ) )
+            // InternalGridSource.g:1613:1: ( 'inputType' )
+            {
+            // InternalGridSource.g:1613:1: ( 'inputType' )
+            // InternalGridSource.g:1614:2: 'inputType'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getInputTypeKeyword_0()); 
+            }
+            match(input,26,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputAccess().getInputTypeKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Input__Group__1"
+    // InternalGridSource.g:1623:1: rule__Input__Group__1 : rule__Input__Group__1__Impl rule__Input__Group__2 ;
+    public final void rule__Input__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1627:1: ( rule__Input__Group__1__Impl rule__Input__Group__2 )
+            // InternalGridSource.g:1628:2: rule__Input__Group__1__Impl rule__Input__Group__2
+            {
+            pushFollow(FOLLOW_13);
+            rule__Input__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Input__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__Group__1"
+
+
+    // $ANTLR start "rule__Input__Group__1__Impl"
+    // InternalGridSource.g:1635:1: rule__Input__Group__1__Impl : ( ( rule__Input__InputTypeAssignment_1 ) ) ;
+    public final void rule__Input__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1639:1: ( ( ( rule__Input__InputTypeAssignment_1 ) ) )
+            // InternalGridSource.g:1640:1: ( ( rule__Input__InputTypeAssignment_1 ) )
+            {
+            // InternalGridSource.g:1640:1: ( ( rule__Input__InputTypeAssignment_1 ) )
+            // InternalGridSource.g:1641:2: ( rule__Input__InputTypeAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getInputTypeAssignment_1()); 
+            }
+            // InternalGridSource.g:1642:2: ( rule__Input__InputTypeAssignment_1 )
+            // InternalGridSource.g:1642:3: rule__Input__InputTypeAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__Input__InputTypeAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputAccess().getInputTypeAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Input__Group__2"
+    // InternalGridSource.g:1650:1: rule__Input__Group__2 : rule__Input__Group__2__Impl rule__Input__Group__3 ;
+    public final void rule__Input__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1654:1: ( rule__Input__Group__2__Impl rule__Input__Group__3 )
+            // InternalGridSource.g:1655:2: rule__Input__Group__2__Impl rule__Input__Group__3
+            {
+            pushFollow(FOLLOW_14);
+            rule__Input__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Input__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__Group__2"
+
+
+    // $ANTLR start "rule__Input__Group__2__Impl"
+    // InternalGridSource.g:1662:1: rule__Input__Group__2__Impl : ( 'filters' ) ;
+    public final void rule__Input__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1666:1: ( ( 'filters' ) )
+            // InternalGridSource.g:1667:1: ( 'filters' )
+            {
+            // InternalGridSource.g:1667:1: ( 'filters' )
+            // InternalGridSource.g:1668:2: 'filters'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getFiltersKeyword_2()); 
+            }
+            match(input,27,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputAccess().getFiltersKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Input__Group__3"
+    // InternalGridSource.g:1677:1: rule__Input__Group__3 : rule__Input__Group__3__Impl rule__Input__Group__4 ;
+    public final void rule__Input__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1681:1: ( rule__Input__Group__3__Impl rule__Input__Group__4 )
+            // InternalGridSource.g:1682:2: rule__Input__Group__3__Impl rule__Input__Group__4
+            {
+            pushFollow(FOLLOW_15);
+            rule__Input__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Input__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__Group__3"
+
+
+    // $ANTLR start "rule__Input__Group__3__Impl"
+    // InternalGridSource.g:1689:1: rule__Input__Group__3__Impl : ( ( rule__Input__FiltersAssignment_3 ) ) ;
+    public final void rule__Input__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1693:1: ( ( ( rule__Input__FiltersAssignment_3 ) ) )
+            // InternalGridSource.g:1694:1: ( ( rule__Input__FiltersAssignment_3 ) )
+            {
+            // InternalGridSource.g:1694:1: ( ( rule__Input__FiltersAssignment_3 ) )
+            // InternalGridSource.g:1695:2: ( rule__Input__FiltersAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getFiltersAssignment_3()); 
+            }
+            // InternalGridSource.g:1696:2: ( rule__Input__FiltersAssignment_3 )
+            // InternalGridSource.g:1696:3: rule__Input__FiltersAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__Input__FiltersAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputAccess().getFiltersAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__Group__3__Impl"
+
+
+    // $ANTLR start "rule__Input__Group__4"
+    // InternalGridSource.g:1704:1: rule__Input__Group__4 : rule__Input__Group__4__Impl ;
+    public final void rule__Input__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1708:1: ( rule__Input__Group__4__Impl )
+            // InternalGridSource.g:1709:2: rule__Input__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__Input__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__Group__4"
+
+
+    // $ANTLR start "rule__Input__Group__4__Impl"
+    // InternalGridSource.g:1715:1: rule__Input__Group__4__Impl : ( ( rule__Input__Group_4__0 )* ) ;
+    public final void rule__Input__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1719:1: ( ( ( rule__Input__Group_4__0 )* ) )
+            // InternalGridSource.g:1720:1: ( ( rule__Input__Group_4__0 )* )
+            {
+            // InternalGridSource.g:1720:1: ( ( rule__Input__Group_4__0 )* )
+            // InternalGridSource.g:1721:2: ( rule__Input__Group_4__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getGroup_4()); 
+            }
+            // InternalGridSource.g:1722:2: ( rule__Input__Group_4__0 )*
+            loop13:
+            do {
+                int alt13=2;
+                int LA13_0 = input.LA(1);
+
+                if ( (LA13_0==28) ) {
+                    alt13=1;
+                }
+
+
+                switch (alt13) {
+            	case 1 :
+            	    // InternalGridSource.g:1722:3: rule__Input__Group_4__0
+            	    {
+            	    pushFollow(FOLLOW_16);
+            	    rule__Input__Group_4__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop13;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputAccess().getGroup_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__Group__4__Impl"
+
+
+    // $ANTLR start "rule__Input__Group_4__0"
+    // InternalGridSource.g:1731:1: rule__Input__Group_4__0 : rule__Input__Group_4__0__Impl rule__Input__Group_4__1 ;
+    public final void rule__Input__Group_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1735:1: ( rule__Input__Group_4__0__Impl rule__Input__Group_4__1 )
+            // InternalGridSource.g:1736:2: rule__Input__Group_4__0__Impl rule__Input__Group_4__1
+            {
+            pushFollow(FOLLOW_14);
+            rule__Input__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Input__Group_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__Group_4__0"
+
+
+    // $ANTLR start "rule__Input__Group_4__0__Impl"
+    // InternalGridSource.g:1743:1: rule__Input__Group_4__0__Impl : ( '&&' ) ;
+    public final void rule__Input__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1747:1: ( ( '&&' ) )
+            // InternalGridSource.g:1748:1: ( '&&' )
+            {
+            // InternalGridSource.g:1748:1: ( '&&' )
+            // InternalGridSource.g:1749:2: '&&'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getAmpersandAmpersandKeyword_4_0()); 
+            }
+            match(input,28,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputAccess().getAmpersandAmpersandKeyword_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__Group_4__0__Impl"
+
+
+    // $ANTLR start "rule__Input__Group_4__1"
+    // InternalGridSource.g:1758:1: rule__Input__Group_4__1 : rule__Input__Group_4__1__Impl ;
+    public final void rule__Input__Group_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1762:1: ( rule__Input__Group_4__1__Impl )
+            // InternalGridSource.g:1763:2: rule__Input__Group_4__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__Input__Group_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__Group_4__1"
+
+
+    // $ANTLR start "rule__Input__Group_4__1__Impl"
+    // InternalGridSource.g:1769:1: rule__Input__Group_4__1__Impl : ( ( rule__Input__FiltersAssignment_4_1 ) ) ;
+    public final void rule__Input__Group_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1773:1: ( ( ( rule__Input__FiltersAssignment_4_1 ) ) )
+            // InternalGridSource.g:1774:1: ( ( rule__Input__FiltersAssignment_4_1 ) )
+            {
+            // InternalGridSource.g:1774:1: ( ( rule__Input__FiltersAssignment_4_1 ) )
+            // InternalGridSource.g:1775:2: ( rule__Input__FiltersAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getFiltersAssignment_4_1()); 
+            }
+            // InternalGridSource.g:1776:2: ( rule__Input__FiltersAssignment_4_1 )
+            // InternalGridSource.g:1776:3: rule__Input__FiltersAssignment_4_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__Input__FiltersAssignment_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputAccess().getFiltersAssignment_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__Group_4__1__Impl"
+
+
+    // $ANTLR start "rule__EQFilter__Group__0"
+    // InternalGridSource.g:1785:1: rule__EQFilter__Group__0 : rule__EQFilter__Group__0__Impl rule__EQFilter__Group__1 ;
+    public final void rule__EQFilter__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1789:1: ( rule__EQFilter__Group__0__Impl rule__EQFilter__Group__1 )
+            // InternalGridSource.g:1790:2: rule__EQFilter__Group__0__Impl rule__EQFilter__Group__1
+            {
+            pushFollow(FOLLOW_14);
+            rule__EQFilter__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EQFilter__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EQFilter__Group__0"
+
+
+    // $ANTLR start "rule__EQFilter__Group__0__Impl"
+    // InternalGridSource.g:1797:1: rule__EQFilter__Group__0__Impl : ( () ) ;
+    public final void rule__EQFilter__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1801:1: ( ( () ) )
+            // InternalGridSource.g:1802:1: ( () )
+            {
+            // InternalGridSource.g:1802:1: ( () )
+            // InternalGridSource.g:1803:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getCxGridSourceEQFilterAction_0()); 
+            }
+            // InternalGridSource.g:1804:2: ()
+            // InternalGridSource.g:1804:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEQFilterAccess().getCxGridSourceEQFilterAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EQFilter__Group__0__Impl"
+
+
+    // $ANTLR start "rule__EQFilter__Group__1"
+    // InternalGridSource.g:1812:1: rule__EQFilter__Group__1 : rule__EQFilter__Group__1__Impl rule__EQFilter__Group__2 ;
+    public final void rule__EQFilter__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1816:1: ( rule__EQFilter__Group__1__Impl rule__EQFilter__Group__2 )
+            // InternalGridSource.g:1817:2: rule__EQFilter__Group__1__Impl rule__EQFilter__Group__2
+            {
+            pushFollow(FOLLOW_4);
+            rule__EQFilter__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EQFilter__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EQFilter__Group__1"
+
+
+    // $ANTLR start "rule__EQFilter__Group__1__Impl"
+    // InternalGridSource.g:1824:1: rule__EQFilter__Group__1__Impl : ( 'root:' ) ;
+    public final void rule__EQFilter__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1828:1: ( ( 'root:' ) )
+            // InternalGridSource.g:1829:1: ( 'root:' )
+            {
+            // InternalGridSource.g:1829:1: ( 'root:' )
+            // InternalGridSource.g:1830:2: 'root:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getRootKeyword_1()); 
+            }
+            match(input,29,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEQFilterAccess().getRootKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EQFilter__Group__1__Impl"
+
+
+    // $ANTLR start "rule__EQFilter__Group__2"
+    // InternalGridSource.g:1839:1: rule__EQFilter__Group__2 : rule__EQFilter__Group__2__Impl rule__EQFilter__Group__3 ;
+    public final void rule__EQFilter__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1843:1: ( rule__EQFilter__Group__2__Impl rule__EQFilter__Group__3 )
+            // InternalGridSource.g:1844:2: rule__EQFilter__Group__2__Impl rule__EQFilter__Group__3
+            {
+            pushFollow(FOLLOW_17);
+            rule__EQFilter__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EQFilter__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EQFilter__Group__2"
+
+
+    // $ANTLR start "rule__EQFilter__Group__2__Impl"
+    // InternalGridSource.g:1851:1: rule__EQFilter__Group__2__Impl : ( ( rule__EQFilter__RootTypePropertyPathAssignment_2 ) ) ;
+    public final void rule__EQFilter__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1855:1: ( ( ( rule__EQFilter__RootTypePropertyPathAssignment_2 ) ) )
+            // InternalGridSource.g:1856:1: ( ( rule__EQFilter__RootTypePropertyPathAssignment_2 ) )
+            {
+            // InternalGridSource.g:1856:1: ( ( rule__EQFilter__RootTypePropertyPathAssignment_2 ) )
+            // InternalGridSource.g:1857:2: ( rule__EQFilter__RootTypePropertyPathAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getRootTypePropertyPathAssignment_2()); 
+            }
+            // InternalGridSource.g:1858:2: ( rule__EQFilter__RootTypePropertyPathAssignment_2 )
+            // InternalGridSource.g:1858:3: rule__EQFilter__RootTypePropertyPathAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__EQFilter__RootTypePropertyPathAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEQFilterAccess().getRootTypePropertyPathAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EQFilter__Group__2__Impl"
+
+
+    // $ANTLR start "rule__EQFilter__Group__3"
+    // InternalGridSource.g:1866:1: rule__EQFilter__Group__3 : rule__EQFilter__Group__3__Impl rule__EQFilter__Group__4 ;
+    public final void rule__EQFilter__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1870:1: ( rule__EQFilter__Group__3__Impl rule__EQFilter__Group__4 )
+            // InternalGridSource.g:1871:2: rule__EQFilter__Group__3__Impl rule__EQFilter__Group__4
+            {
+            pushFollow(FOLLOW_18);
+            rule__EQFilter__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EQFilter__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EQFilter__Group__3"
+
+
+    // $ANTLR start "rule__EQFilter__Group__3__Impl"
+    // InternalGridSource.g:1878:1: rule__EQFilter__Group__3__Impl : ( '=' ) ;
+    public final void rule__EQFilter__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1882:1: ( ( '=' ) )
+            // InternalGridSource.g:1883:1: ( '=' )
+            {
+            // InternalGridSource.g:1883:1: ( '=' )
+            // InternalGridSource.g:1884:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getEqualsSignKeyword_3()); 
+            }
+            match(input,30,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEQFilterAccess().getEqualsSignKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EQFilter__Group__3__Impl"
+
+
+    // $ANTLR start "rule__EQFilter__Group__4"
+    // InternalGridSource.g:1893:1: rule__EQFilter__Group__4 : rule__EQFilter__Group__4__Impl rule__EQFilter__Group__5 ;
+    public final void rule__EQFilter__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1897:1: ( rule__EQFilter__Group__4__Impl rule__EQFilter__Group__5 )
+            // InternalGridSource.g:1898:2: rule__EQFilter__Group__4__Impl rule__EQFilter__Group__5
+            {
+            pushFollow(FOLLOW_4);
+            rule__EQFilter__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__EQFilter__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EQFilter__Group__4"
+
+
+    // $ANTLR start "rule__EQFilter__Group__4__Impl"
+    // InternalGridSource.g:1905:1: rule__EQFilter__Group__4__Impl : ( 'input:' ) ;
+    public final void rule__EQFilter__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1909:1: ( ( 'input:' ) )
+            // InternalGridSource.g:1910:1: ( 'input:' )
+            {
+            // InternalGridSource.g:1910:1: ( 'input:' )
+            // InternalGridSource.g:1911:2: 'input:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getInputKeyword_4()); 
+            }
+            match(input,31,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEQFilterAccess().getInputKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EQFilter__Group__4__Impl"
+
+
+    // $ANTLR start "rule__EQFilter__Group__5"
+    // InternalGridSource.g:1920:1: rule__EQFilter__Group__5 : rule__EQFilter__Group__5__Impl ;
+    public final void rule__EQFilter__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1924:1: ( rule__EQFilter__Group__5__Impl )
+            // InternalGridSource.g:1925:2: rule__EQFilter__Group__5__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__EQFilter__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EQFilter__Group__5"
+
+
+    // $ANTLR start "rule__EQFilter__Group__5__Impl"
+    // InternalGridSource.g:1931:1: rule__EQFilter__Group__5__Impl : ( ( rule__EQFilter__InputTypePropertyPathAssignment_5 ) ) ;
+    public final void rule__EQFilter__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1935:1: ( ( ( rule__EQFilter__InputTypePropertyPathAssignment_5 ) ) )
+            // InternalGridSource.g:1936:1: ( ( rule__EQFilter__InputTypePropertyPathAssignment_5 ) )
+            {
+            // InternalGridSource.g:1936:1: ( ( rule__EQFilter__InputTypePropertyPathAssignment_5 ) )
+            // InternalGridSource.g:1937:2: ( rule__EQFilter__InputTypePropertyPathAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getInputTypePropertyPathAssignment_5()); 
+            }
+            // InternalGridSource.g:1938:2: ( rule__EQFilter__InputTypePropertyPathAssignment_5 )
+            // InternalGridSource.g:1938:3: rule__EQFilter__InputTypePropertyPathAssignment_5
+            {
+            pushFollow(FOLLOW_2);
+            rule__EQFilter__InputTypePropertyPathAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEQFilterAccess().getInputTypePropertyPathAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EQFilter__Group__5__Impl"
+
+
+    // $ANTLR start "rule__Property__Group__0"
+    // InternalGridSource.g:1947:1: rule__Property__Group__0 : rule__Property__Group__0__Impl rule__Property__Group__1 ;
+    public final void rule__Property__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1951:1: ( rule__Property__Group__0__Impl rule__Property__Group__1 )
+            // InternalGridSource.g:1952:2: rule__Property__Group__0__Impl rule__Property__Group__1
+            {
+            pushFollow(FOLLOW_4);
+            rule__Property__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Property__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Property__Group__0"
+
+
+    // $ANTLR start "rule__Property__Group__0__Impl"
+    // InternalGridSource.g:1959:1: rule__Property__Group__0__Impl : ( 'prop' ) ;
+    public final void rule__Property__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1963:1: ( ( 'prop' ) )
+            // InternalGridSource.g:1964:1: ( 'prop' )
+            {
+            // InternalGridSource.g:1964:1: ( 'prop' )
+            // InternalGridSource.g:1965:2: 'prop'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyAccess().getPropKeyword_0()); 
+            }
+            match(input,32,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyAccess().getPropKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Property__Group__0__Impl"
+
+
+    // $ANTLR start "rule__Property__Group__1"
+    // InternalGridSource.g:1974:1: rule__Property__Group__1 : rule__Property__Group__1__Impl rule__Property__Group__2 ;
+    public final void rule__Property__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1978:1: ( rule__Property__Group__1__Impl rule__Property__Group__2 )
+            // InternalGridSource.g:1979:2: rule__Property__Group__1__Impl rule__Property__Group__2
+            {
+            pushFollow(FOLLOW_19);
+            rule__Property__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Property__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Property__Group__1"
+
+
+    // $ANTLR start "rule__Property__Group__1__Impl"
+    // InternalGridSource.g:1986:1: rule__Property__Group__1__Impl : ( ( rule__Property__PathAssignment_1 ) ) ;
+    public final void rule__Property__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:1990:1: ( ( ( rule__Property__PathAssignment_1 ) ) )
+            // InternalGridSource.g:1991:1: ( ( rule__Property__PathAssignment_1 ) )
+            {
+            // InternalGridSource.g:1991:1: ( ( rule__Property__PathAssignment_1 ) )
+            // InternalGridSource.g:1992:2: ( rule__Property__PathAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyAccess().getPathAssignment_1()); 
+            }
+            // InternalGridSource.g:1993:2: ( rule__Property__PathAssignment_1 )
+            // InternalGridSource.g:1993:3: rule__Property__PathAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__Property__PathAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyAccess().getPathAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Property__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Property__Group__2"
+    // InternalGridSource.g:2001:1: rule__Property__Group__2 : rule__Property__Group__2__Impl rule__Property__Group__3 ;
+    public final void rule__Property__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2005:1: ( rule__Property__Group__2__Impl rule__Property__Group__3 )
+            // InternalGridSource.g:2006:2: rule__Property__Group__2__Impl rule__Property__Group__3
+            {
+            pushFollow(FOLLOW_20);
+            rule__Property__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__Property__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Property__Group__2"
+
+
+    // $ANTLR start "rule__Property__Group__2__Impl"
+    // InternalGridSource.g:2013:1: rule__Property__Group__2__Impl : ( 'style' ) ;
+    public final void rule__Property__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2017:1: ( ( 'style' ) )
+            // InternalGridSource.g:2018:1: ( 'style' )
+            {
+            // InternalGridSource.g:2018:1: ( 'style' )
+            // InternalGridSource.g:2019:2: 'style'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyAccess().getStyleKeyword_2()); 
+            }
+            match(input,33,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyAccess().getStyleKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Property__Group__2__Impl"
+
+
+    // $ANTLR start "rule__Property__Group__3"
+    // InternalGridSource.g:2028:1: rule__Property__Group__3 : rule__Property__Group__3__Impl ;
+    public final void rule__Property__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2032:1: ( rule__Property__Group__3__Impl )
+            // InternalGridSource.g:2033:2: rule__Property__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__Property__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Property__Group__3"
+
+
+    // $ANTLR start "rule__Property__Group__3__Impl"
+    // InternalGridSource.g:2039:1: rule__Property__Group__3__Impl : ( ( rule__Property__StyleAssignment_3 ) ) ;
+    public final void rule__Property__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2043:1: ( ( ( rule__Property__StyleAssignment_3 ) ) )
+            // InternalGridSource.g:2044:1: ( ( rule__Property__StyleAssignment_3 ) )
+            {
+            // InternalGridSource.g:2044:1: ( ( rule__Property__StyleAssignment_3 ) )
+            // InternalGridSource.g:2045:2: ( rule__Property__StyleAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyAccess().getStyleAssignment_3()); 
+            }
+            // InternalGridSource.g:2046:2: ( rule__Property__StyleAssignment_3 )
+            // InternalGridSource.g:2046:3: rule__Property__StyleAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__Property__StyleAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyAccess().getStyleAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Property__Group__3__Impl"
+
+
+    // $ANTLR start "rule__NestedField__Group__0"
+    // InternalGridSource.g:2055:1: rule__NestedField__Group__0 : rule__NestedField__Group__0__Impl rule__NestedField__Group__1 ;
+    public final void rule__NestedField__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2059:1: ( rule__NestedField__Group__0__Impl rule__NestedField__Group__1 )
+            // InternalGridSource.g:2060:2: rule__NestedField__Group__0__Impl rule__NestedField__Group__1
+            {
+            pushFollow(FOLLOW_4);
+            rule__NestedField__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__NestedField__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedField__Group__0"
+
+
+    // $ANTLR start "rule__NestedField__Group__0__Impl"
+    // InternalGridSource.g:2067:1: rule__NestedField__Group__0__Impl : ( () ) ;
+    public final void rule__NestedField__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2071:1: ( ( () ) )
+            // InternalGridSource.g:2072:1: ( () )
+            {
+            // InternalGridSource.g:2072:1: ( () )
+            // InternalGridSource.g:2073:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedFieldAccess().getCxGridNestedFieldAction_0()); 
+            }
+            // InternalGridSource.g:2074:2: ()
+            // InternalGridSource.g:2074:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedFieldAccess().getCxGridNestedFieldAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedField__Group__0__Impl"
+
+
+    // $ANTLR start "rule__NestedField__Group__1"
+    // InternalGridSource.g:2082:1: rule__NestedField__Group__1 : rule__NestedField__Group__1__Impl rule__NestedField__Group__2 ;
+    public final void rule__NestedField__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2086:1: ( rule__NestedField__Group__1__Impl rule__NestedField__Group__2 )
+            // InternalGridSource.g:2087:2: rule__NestedField__Group__1__Impl rule__NestedField__Group__2
+            {
+            pushFollow(FOLLOW_21);
+            rule__NestedField__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__NestedField__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedField__Group__1"
+
+
+    // $ANTLR start "rule__NestedField__Group__1__Impl"
+    // InternalGridSource.g:2094:1: rule__NestedField__Group__1__Impl : ( ( rule__NestedField__FieldAssignment_1 ) ) ;
+    public final void rule__NestedField__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2098:1: ( ( ( rule__NestedField__FieldAssignment_1 ) ) )
+            // InternalGridSource.g:2099:1: ( ( rule__NestedField__FieldAssignment_1 ) )
+            {
+            // InternalGridSource.g:2099:1: ( ( rule__NestedField__FieldAssignment_1 ) )
+            // InternalGridSource.g:2100:2: ( rule__NestedField__FieldAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedFieldAccess().getFieldAssignment_1()); 
+            }
+            // InternalGridSource.g:2101:2: ( rule__NestedField__FieldAssignment_1 )
+            // InternalGridSource.g:2101:3: rule__NestedField__FieldAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__NestedField__FieldAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedFieldAccess().getFieldAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedField__Group__1__Impl"
+
+
+    // $ANTLR start "rule__NestedField__Group__2"
+    // InternalGridSource.g:2109:1: rule__NestedField__Group__2 : rule__NestedField__Group__2__Impl ;
+    public final void rule__NestedField__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2113:1: ( rule__NestedField__Group__2__Impl )
+            // InternalGridSource.g:2114:2: rule__NestedField__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__NestedField__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedField__Group__2"
+
+
+    // $ANTLR start "rule__NestedField__Group__2__Impl"
+    // InternalGridSource.g:2120:1: rule__NestedField__Group__2__Impl : ( ( rule__NestedField__PathAssignment_2 )? ) ;
+    public final void rule__NestedField__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2124:1: ( ( ( rule__NestedField__PathAssignment_2 )? ) )
+            // InternalGridSource.g:2125:1: ( ( rule__NestedField__PathAssignment_2 )? )
+            {
+            // InternalGridSource.g:2125:1: ( ( rule__NestedField__PathAssignment_2 )? )
+            // InternalGridSource.g:2126:2: ( rule__NestedField__PathAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedFieldAccess().getPathAssignment_2()); 
+            }
+            // InternalGridSource.g:2127:2: ( rule__NestedField__PathAssignment_2 )?
+            int alt14=2;
+            int LA14_0 = input.LA(1);
+
+            if ( (LA14_0==34) ) {
+                alt14=1;
+            }
+            switch (alt14) {
+                case 1 :
+                    // InternalGridSource.g:2127:3: rule__NestedField__PathAssignment_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__NestedField__PathAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedFieldAccess().getPathAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedField__Group__2__Impl"
+
+
+    // $ANTLR start "rule__NestedPath__Group__0"
+    // InternalGridSource.g:2136:1: rule__NestedPath__Group__0 : rule__NestedPath__Group__0__Impl rule__NestedPath__Group__1 ;
+    public final void rule__NestedPath__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2140:1: ( rule__NestedPath__Group__0__Impl rule__NestedPath__Group__1 )
+            // InternalGridSource.g:2141:2: rule__NestedPath__Group__0__Impl rule__NestedPath__Group__1
+            {
+            pushFollow(FOLLOW_21);
+            rule__NestedPath__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__NestedPath__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedPath__Group__0"
+
+
+    // $ANTLR start "rule__NestedPath__Group__0__Impl"
+    // InternalGridSource.g:2148:1: rule__NestedPath__Group__0__Impl : ( () ) ;
+    public final void rule__NestedPath__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2152:1: ( ( () ) )
+            // InternalGridSource.g:2153:1: ( () )
+            {
+            // InternalGridSource.g:2153:1: ( () )
+            // InternalGridSource.g:2154:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathAccess().getCxGridNestedPathAction_0()); 
+            }
+            // InternalGridSource.g:2155:2: ()
+            // InternalGridSource.g:2155:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedPathAccess().getCxGridNestedPathAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedPath__Group__0__Impl"
+
+
+    // $ANTLR start "rule__NestedPath__Group__1"
+    // InternalGridSource.g:2163:1: rule__NestedPath__Group__1 : rule__NestedPath__Group__1__Impl rule__NestedPath__Group__2 ;
+    public final void rule__NestedPath__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2167:1: ( rule__NestedPath__Group__1__Impl rule__NestedPath__Group__2 )
+            // InternalGridSource.g:2168:2: rule__NestedPath__Group__1__Impl rule__NestedPath__Group__2
+            {
+            pushFollow(FOLLOW_4);
+            rule__NestedPath__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__NestedPath__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedPath__Group__1"
+
+
+    // $ANTLR start "rule__NestedPath__Group__1__Impl"
+    // InternalGridSource.g:2175:1: rule__NestedPath__Group__1__Impl : ( '.' ) ;
+    public final void rule__NestedPath__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2179:1: ( ( '.' ) )
+            // InternalGridSource.g:2180:1: ( '.' )
+            {
+            // InternalGridSource.g:2180:1: ( '.' )
+            // InternalGridSource.g:2181:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathAccess().getFullStopKeyword_1()); 
+            }
+            match(input,34,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedPathAccess().getFullStopKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedPath__Group__1__Impl"
+
+
+    // $ANTLR start "rule__NestedPath__Group__2"
+    // InternalGridSource.g:2190:1: rule__NestedPath__Group__2 : rule__NestedPath__Group__2__Impl rule__NestedPath__Group__3 ;
+    public final void rule__NestedPath__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2194:1: ( rule__NestedPath__Group__2__Impl rule__NestedPath__Group__3 )
+            // InternalGridSource.g:2195:2: rule__NestedPath__Group__2__Impl rule__NestedPath__Group__3
+            {
+            pushFollow(FOLLOW_21);
+            rule__NestedPath__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__NestedPath__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedPath__Group__2"
+
+
+    // $ANTLR start "rule__NestedPath__Group__2__Impl"
+    // InternalGridSource.g:2202:1: rule__NestedPath__Group__2__Impl : ( ( rule__NestedPath__FieldAssignment_2 ) ) ;
+    public final void rule__NestedPath__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2206:1: ( ( ( rule__NestedPath__FieldAssignment_2 ) ) )
+            // InternalGridSource.g:2207:1: ( ( rule__NestedPath__FieldAssignment_2 ) )
+            {
+            // InternalGridSource.g:2207:1: ( ( rule__NestedPath__FieldAssignment_2 ) )
+            // InternalGridSource.g:2208:2: ( rule__NestedPath__FieldAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathAccess().getFieldAssignment_2()); 
+            }
+            // InternalGridSource.g:2209:2: ( rule__NestedPath__FieldAssignment_2 )
+            // InternalGridSource.g:2209:3: rule__NestedPath__FieldAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__NestedPath__FieldAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedPathAccess().getFieldAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedPath__Group__2__Impl"
+
+
+    // $ANTLR start "rule__NestedPath__Group__3"
+    // InternalGridSource.g:2217:1: rule__NestedPath__Group__3 : rule__NestedPath__Group__3__Impl ;
+    public final void rule__NestedPath__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2221:1: ( rule__NestedPath__Group__3__Impl )
+            // InternalGridSource.g:2222:2: rule__NestedPath__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__NestedPath__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedPath__Group__3"
+
+
+    // $ANTLR start "rule__NestedPath__Group__3__Impl"
+    // InternalGridSource.g:2228:1: rule__NestedPath__Group__3__Impl : ( ( rule__NestedPath__PathAssignment_3 )? ) ;
+    public final void rule__NestedPath__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2232:1: ( ( ( rule__NestedPath__PathAssignment_3 )? ) )
+            // InternalGridSource.g:2233:1: ( ( rule__NestedPath__PathAssignment_3 )? )
+            {
+            // InternalGridSource.g:2233:1: ( ( rule__NestedPath__PathAssignment_3 )? )
+            // InternalGridSource.g:2234:2: ( rule__NestedPath__PathAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathAccess().getPathAssignment_3()); 
+            }
+            // InternalGridSource.g:2235:2: ( rule__NestedPath__PathAssignment_3 )?
+            int alt15=2;
+            int LA15_0 = input.LA(1);
+
+            if ( (LA15_0==34) ) {
+                alt15=1;
+            }
+            switch (alt15) {
+                case 1 :
+                    // InternalGridSource.g:2235:3: rule__NestedPath__PathAssignment_3
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__NestedPath__PathAssignment_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedPathAccess().getPathAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedPath__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyButtonStyle__Group__0"
+    // InternalGridSource.g:2244:1: rule__PropertyButtonStyle__Group__0 : rule__PropertyButtonStyle__Group__0__Impl rule__PropertyButtonStyle__Group__1 ;
+    public final void rule__PropertyButtonStyle__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2248:1: ( rule__PropertyButtonStyle__Group__0__Impl rule__PropertyButtonStyle__Group__1 )
+            // InternalGridSource.g:2249:2: rule__PropertyButtonStyle__Group__0__Impl rule__PropertyButtonStyle__Group__1
+            {
+            pushFollow(FOLLOW_22);
+            rule__PropertyButtonStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyButtonStyle__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyButtonStyle__Group__0"
+
+
+    // $ANTLR start "rule__PropertyButtonStyle__Group__0__Impl"
+    // InternalGridSource.g:2256:1: rule__PropertyButtonStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyButtonStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2260:1: ( ( () ) )
+            // InternalGridSource.g:2261:1: ( () )
+            {
+            // InternalGridSource.g:2261:1: ( () )
+            // InternalGridSource.g:2262:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyButtonStyleAccess().getCxGridPropButtonStyleAction_0()); 
+            }
+            // InternalGridSource.g:2263:2: ()
+            // InternalGridSource.g:2263:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyButtonStyleAccess().getCxGridPropButtonStyleAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyButtonStyle__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyButtonStyle__Group__1"
+    // InternalGridSource.g:2271:1: rule__PropertyButtonStyle__Group__1 : rule__PropertyButtonStyle__Group__1__Impl rule__PropertyButtonStyle__Group__2 ;
+    public final void rule__PropertyButtonStyle__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2275:1: ( rule__PropertyButtonStyle__Group__1__Impl rule__PropertyButtonStyle__Group__2 )
+            // InternalGridSource.g:2276:2: rule__PropertyButtonStyle__Group__1__Impl rule__PropertyButtonStyle__Group__2
+            {
+            pushFollow(FOLLOW_23);
+            rule__PropertyButtonStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyButtonStyle__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyButtonStyle__Group__1"
+
+
+    // $ANTLR start "rule__PropertyButtonStyle__Group__1__Impl"
+    // InternalGridSource.g:2283:1: rule__PropertyButtonStyle__Group__1__Impl : ( 'buttonStyle' ) ;
+    public final void rule__PropertyButtonStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2287:1: ( ( 'buttonStyle' ) )
+            // InternalGridSource.g:2288:1: ( 'buttonStyle' )
+            {
+            // InternalGridSource.g:2288:1: ( 'buttonStyle' )
+            // InternalGridSource.g:2289:2: 'buttonStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyButtonStyleAccess().getButtonStyleKeyword_1()); 
+            }
+            match(input,35,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyButtonStyleAccess().getButtonStyleKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyButtonStyle__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyButtonStyle__Group__2"
+    // InternalGridSource.g:2298:1: rule__PropertyButtonStyle__Group__2 : rule__PropertyButtonStyle__Group__2__Impl rule__PropertyButtonStyle__Group__3 ;
+    public final void rule__PropertyButtonStyle__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2302:1: ( rule__PropertyButtonStyle__Group__2__Impl rule__PropertyButtonStyle__Group__3 )
+            // InternalGridSource.g:2303:2: rule__PropertyButtonStyle__Group__2__Impl rule__PropertyButtonStyle__Group__3
+            {
+            pushFollow(FOLLOW_24);
+            rule__PropertyButtonStyle__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyButtonStyle__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyButtonStyle__Group__2"
+
+
+    // $ANTLR start "rule__PropertyButtonStyle__Group__2__Impl"
+    // InternalGridSource.g:2310:1: rule__PropertyButtonStyle__Group__2__Impl : ( 'eventTopic' ) ;
+    public final void rule__PropertyButtonStyle__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2314:1: ( ( 'eventTopic' ) )
+            // InternalGridSource.g:2315:1: ( 'eventTopic' )
+            {
+            // InternalGridSource.g:2315:1: ( 'eventTopic' )
+            // InternalGridSource.g:2316:2: 'eventTopic'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyButtonStyleAccess().getEventTopicKeyword_2()); 
+            }
+            match(input,36,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyButtonStyleAccess().getEventTopicKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyButtonStyle__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyButtonStyle__Group__3"
+    // InternalGridSource.g:2325:1: rule__PropertyButtonStyle__Group__3 : rule__PropertyButtonStyle__Group__3__Impl ;
+    public final void rule__PropertyButtonStyle__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2329:1: ( rule__PropertyButtonStyle__Group__3__Impl )
+            // InternalGridSource.g:2330:2: rule__PropertyButtonStyle__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyButtonStyle__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyButtonStyle__Group__3"
+
+
+    // $ANTLR start "rule__PropertyButtonStyle__Group__3__Impl"
+    // InternalGridSource.g:2336:1: rule__PropertyButtonStyle__Group__3__Impl : ( ( rule__PropertyButtonStyle__EventTopicAssignment_3 ) ) ;
+    public final void rule__PropertyButtonStyle__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2340:1: ( ( ( rule__PropertyButtonStyle__EventTopicAssignment_3 ) ) )
+            // InternalGridSource.g:2341:1: ( ( rule__PropertyButtonStyle__EventTopicAssignment_3 ) )
+            {
+            // InternalGridSource.g:2341:1: ( ( rule__PropertyButtonStyle__EventTopicAssignment_3 ) )
+            // InternalGridSource.g:2342:2: ( rule__PropertyButtonStyle__EventTopicAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyButtonStyleAccess().getEventTopicAssignment_3()); 
+            }
+            // InternalGridSource.g:2343:2: ( rule__PropertyButtonStyle__EventTopicAssignment_3 )
+            // InternalGridSource.g:2343:3: rule__PropertyButtonStyle__EventTopicAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyButtonStyle__EventTopicAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyButtonStyleAccess().getEventTopicAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyButtonStyle__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyHtmlStyle__Group__0"
+    // InternalGridSource.g:2352:1: rule__PropertyHtmlStyle__Group__0 : rule__PropertyHtmlStyle__Group__0__Impl rule__PropertyHtmlStyle__Group__1 ;
+    public final void rule__PropertyHtmlStyle__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2356:1: ( rule__PropertyHtmlStyle__Group__0__Impl rule__PropertyHtmlStyle__Group__1 )
+            // InternalGridSource.g:2357:2: rule__PropertyHtmlStyle__Group__0__Impl rule__PropertyHtmlStyle__Group__1
+            {
+            pushFollow(FOLLOW_25);
+            rule__PropertyHtmlStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyHtmlStyle__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyHtmlStyle__Group__0"
+
+
+    // $ANTLR start "rule__PropertyHtmlStyle__Group__0__Impl"
+    // InternalGridSource.g:2364:1: rule__PropertyHtmlStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyHtmlStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2368:1: ( ( () ) )
+            // InternalGridSource.g:2369:1: ( () )
+            {
+            // InternalGridSource.g:2369:1: ( () )
+            // InternalGridSource.g:2370:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyHtmlStyleAccess().getCxGridPropHtmlStyleAction_0()); 
+            }
+            // InternalGridSource.g:2371:2: ()
+            // InternalGridSource.g:2371:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyHtmlStyleAccess().getCxGridPropHtmlStyleAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyHtmlStyle__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyHtmlStyle__Group__1"
+    // InternalGridSource.g:2379:1: rule__PropertyHtmlStyle__Group__1 : rule__PropertyHtmlStyle__Group__1__Impl ;
+    public final void rule__PropertyHtmlStyle__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2383:1: ( rule__PropertyHtmlStyle__Group__1__Impl )
+            // InternalGridSource.g:2384:2: rule__PropertyHtmlStyle__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyHtmlStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyHtmlStyle__Group__1"
+
+
+    // $ANTLR start "rule__PropertyHtmlStyle__Group__1__Impl"
+    // InternalGridSource.g:2390:1: rule__PropertyHtmlStyle__Group__1__Impl : ( 'htmlStyle' ) ;
+    public final void rule__PropertyHtmlStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2394:1: ( ( 'htmlStyle' ) )
+            // InternalGridSource.g:2395:1: ( 'htmlStyle' )
+            {
+            // InternalGridSource.g:2395:1: ( 'htmlStyle' )
+            // InternalGridSource.g:2396:2: 'htmlStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyHtmlStyleAccess().getHtmlStyleKeyword_1()); 
+            }
+            match(input,37,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyHtmlStyleAccess().getHtmlStyleKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyHtmlStyle__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyBooleanStyle__Group__0"
+    // InternalGridSource.g:2406:1: rule__PropertyBooleanStyle__Group__0 : rule__PropertyBooleanStyle__Group__0__Impl rule__PropertyBooleanStyle__Group__1 ;
+    public final void rule__PropertyBooleanStyle__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2410:1: ( rule__PropertyBooleanStyle__Group__0__Impl rule__PropertyBooleanStyle__Group__1 )
+            // InternalGridSource.g:2411:2: rule__PropertyBooleanStyle__Group__0__Impl rule__PropertyBooleanStyle__Group__1
+            {
+            pushFollow(FOLLOW_26);
+            rule__PropertyBooleanStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyBooleanStyle__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyBooleanStyle__Group__0"
+
+
+    // $ANTLR start "rule__PropertyBooleanStyle__Group__0__Impl"
+    // InternalGridSource.g:2418:1: rule__PropertyBooleanStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyBooleanStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2422:1: ( ( () ) )
+            // InternalGridSource.g:2423:1: ( () )
+            {
+            // InternalGridSource.g:2423:1: ( () )
+            // InternalGridSource.g:2424:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyBooleanStyleAccess().getCxGridPropBooleanStyleAction_0()); 
+            }
+            // InternalGridSource.g:2425:2: ()
+            // InternalGridSource.g:2425:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyBooleanStyleAccess().getCxGridPropBooleanStyleAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyBooleanStyle__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyBooleanStyle__Group__1"
+    // InternalGridSource.g:2433:1: rule__PropertyBooleanStyle__Group__1 : rule__PropertyBooleanStyle__Group__1__Impl ;
+    public final void rule__PropertyBooleanStyle__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2437:1: ( rule__PropertyBooleanStyle__Group__1__Impl )
+            // InternalGridSource.g:2438:2: rule__PropertyBooleanStyle__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyBooleanStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyBooleanStyle__Group__1"
+
+
+    // $ANTLR start "rule__PropertyBooleanStyle__Group__1__Impl"
+    // InternalGridSource.g:2444:1: rule__PropertyBooleanStyle__Group__1__Impl : ( 'boolStyle' ) ;
+    public final void rule__PropertyBooleanStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2448:1: ( ( 'boolStyle' ) )
+            // InternalGridSource.g:2449:1: ( 'boolStyle' )
+            {
+            // InternalGridSource.g:2449:1: ( 'boolStyle' )
+            // InternalGridSource.g:2450:2: 'boolStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyBooleanStyleAccess().getBoolStyleKeyword_1()); 
+            }
+            match(input,38,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyBooleanStyleAccess().getBoolStyleKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyBooleanStyle__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyDateStyle__Group__0"
+    // InternalGridSource.g:2460:1: rule__PropertyDateStyle__Group__0 : rule__PropertyDateStyle__Group__0__Impl rule__PropertyDateStyle__Group__1 ;
+    public final void rule__PropertyDateStyle__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2464:1: ( rule__PropertyDateStyle__Group__0__Impl rule__PropertyDateStyle__Group__1 )
+            // InternalGridSource.g:2465:2: rule__PropertyDateStyle__Group__0__Impl rule__PropertyDateStyle__Group__1
+            {
+            pushFollow(FOLLOW_27);
+            rule__PropertyDateStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyDateStyle__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyDateStyle__Group__0"
+
+
+    // $ANTLR start "rule__PropertyDateStyle__Group__0__Impl"
+    // InternalGridSource.g:2472:1: rule__PropertyDateStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyDateStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2476:1: ( ( () ) )
+            // InternalGridSource.g:2477:1: ( () )
+            {
+            // InternalGridSource.g:2477:1: ( () )
+            // InternalGridSource.g:2478:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyDateStyleAccess().getCxGridPropDateStyleAction_0()); 
+            }
+            // InternalGridSource.g:2479:2: ()
+            // InternalGridSource.g:2479:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyDateStyleAccess().getCxGridPropDateStyleAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyDateStyle__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyDateStyle__Group__1"
+    // InternalGridSource.g:2487:1: rule__PropertyDateStyle__Group__1 : rule__PropertyDateStyle__Group__1__Impl rule__PropertyDateStyle__Group__2 ;
+    public final void rule__PropertyDateStyle__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2491:1: ( rule__PropertyDateStyle__Group__1__Impl rule__PropertyDateStyle__Group__2 )
+            // InternalGridSource.g:2492:2: rule__PropertyDateStyle__Group__1__Impl rule__PropertyDateStyle__Group__2
+            {
+            pushFollow(FOLLOW_28);
+            rule__PropertyDateStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyDateStyle__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyDateStyle__Group__1"
+
+
+    // $ANTLR start "rule__PropertyDateStyle__Group__1__Impl"
+    // InternalGridSource.g:2499:1: rule__PropertyDateStyle__Group__1__Impl : ( 'dateStyle' ) ;
+    public final void rule__PropertyDateStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2503:1: ( ( 'dateStyle' ) )
+            // InternalGridSource.g:2504:1: ( 'dateStyle' )
+            {
+            // InternalGridSource.g:2504:1: ( 'dateStyle' )
+            // InternalGridSource.g:2505:2: 'dateStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyDateStyleAccess().getDateStyleKeyword_1()); 
+            }
+            match(input,39,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyDateStyleAccess().getDateStyleKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyDateStyle__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyDateStyle__Group__2"
+    // InternalGridSource.g:2514:1: rule__PropertyDateStyle__Group__2 : rule__PropertyDateStyle__Group__2__Impl rule__PropertyDateStyle__Group__3 ;
+    public final void rule__PropertyDateStyle__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2518:1: ( rule__PropertyDateStyle__Group__2__Impl rule__PropertyDateStyle__Group__3 )
+            // InternalGridSource.g:2519:2: rule__PropertyDateStyle__Group__2__Impl rule__PropertyDateStyle__Group__3
+            {
+            pushFollow(FOLLOW_24);
+            rule__PropertyDateStyle__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyDateStyle__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyDateStyle__Group__2"
+
+
+    // $ANTLR start "rule__PropertyDateStyle__Group__2__Impl"
+    // InternalGridSource.g:2526:1: rule__PropertyDateStyle__Group__2__Impl : ( 'format' ) ;
+    public final void rule__PropertyDateStyle__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2530:1: ( ( 'format' ) )
+            // InternalGridSource.g:2531:1: ( 'format' )
+            {
+            // InternalGridSource.g:2531:1: ( 'format' )
+            // InternalGridSource.g:2532:2: 'format'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyDateStyleAccess().getFormatKeyword_2()); 
+            }
+            match(input,40,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyDateStyleAccess().getFormatKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyDateStyle__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyDateStyle__Group__3"
+    // InternalGridSource.g:2541:1: rule__PropertyDateStyle__Group__3 : rule__PropertyDateStyle__Group__3__Impl ;
+    public final void rule__PropertyDateStyle__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2545:1: ( rule__PropertyDateStyle__Group__3__Impl )
+            // InternalGridSource.g:2546:2: rule__PropertyDateStyle__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyDateStyle__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyDateStyle__Group__3"
+
+
+    // $ANTLR start "rule__PropertyDateStyle__Group__3__Impl"
+    // InternalGridSource.g:2552:1: rule__PropertyDateStyle__Group__3__Impl : ( ( rule__PropertyDateStyle__DateFormatAssignment_3 ) ) ;
+    public final void rule__PropertyDateStyle__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2556:1: ( ( ( rule__PropertyDateStyle__DateFormatAssignment_3 ) ) )
+            // InternalGridSource.g:2557:1: ( ( rule__PropertyDateStyle__DateFormatAssignment_3 ) )
+            {
+            // InternalGridSource.g:2557:1: ( ( rule__PropertyDateStyle__DateFormatAssignment_3 ) )
+            // InternalGridSource.g:2558:2: ( rule__PropertyDateStyle__DateFormatAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyDateStyleAccess().getDateFormatAssignment_3()); 
+            }
+            // InternalGridSource.g:2559:2: ( rule__PropertyDateStyle__DateFormatAssignment_3 )
+            // InternalGridSource.g:2559:3: rule__PropertyDateStyle__DateFormatAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyDateStyle__DateFormatAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyDateStyleAccess().getDateFormatAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyDateStyle__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyNumberStyle__Group__0"
+    // InternalGridSource.g:2568:1: rule__PropertyNumberStyle__Group__0 : rule__PropertyNumberStyle__Group__0__Impl rule__PropertyNumberStyle__Group__1 ;
+    public final void rule__PropertyNumberStyle__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2572:1: ( rule__PropertyNumberStyle__Group__0__Impl rule__PropertyNumberStyle__Group__1 )
+            // InternalGridSource.g:2573:2: rule__PropertyNumberStyle__Group__0__Impl rule__PropertyNumberStyle__Group__1
+            {
+            pushFollow(FOLLOW_29);
+            rule__PropertyNumberStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyNumberStyle__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyNumberStyle__Group__0"
+
+
+    // $ANTLR start "rule__PropertyNumberStyle__Group__0__Impl"
+    // InternalGridSource.g:2580:1: rule__PropertyNumberStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyNumberStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2584:1: ( ( () ) )
+            // InternalGridSource.g:2585:1: ( () )
+            {
+            // InternalGridSource.g:2585:1: ( () )
+            // InternalGridSource.g:2586:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyNumberStyleAccess().getCxGridPropNumberStyleAction_0()); 
+            }
+            // InternalGridSource.g:2587:2: ()
+            // InternalGridSource.g:2587:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyNumberStyleAccess().getCxGridPropNumberStyleAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyNumberStyle__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyNumberStyle__Group__1"
+    // InternalGridSource.g:2595:1: rule__PropertyNumberStyle__Group__1 : rule__PropertyNumberStyle__Group__1__Impl rule__PropertyNumberStyle__Group__2 ;
+    public final void rule__PropertyNumberStyle__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2599:1: ( rule__PropertyNumberStyle__Group__1__Impl rule__PropertyNumberStyle__Group__2 )
+            // InternalGridSource.g:2600:2: rule__PropertyNumberStyle__Group__1__Impl rule__PropertyNumberStyle__Group__2
+            {
+            pushFollow(FOLLOW_28);
+            rule__PropertyNumberStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyNumberStyle__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyNumberStyle__Group__1"
+
+
+    // $ANTLR start "rule__PropertyNumberStyle__Group__1__Impl"
+    // InternalGridSource.g:2607:1: rule__PropertyNumberStyle__Group__1__Impl : ( 'numberStyle' ) ;
+    public final void rule__PropertyNumberStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2611:1: ( ( 'numberStyle' ) )
+            // InternalGridSource.g:2612:1: ( 'numberStyle' )
+            {
+            // InternalGridSource.g:2612:1: ( 'numberStyle' )
+            // InternalGridSource.g:2613:2: 'numberStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyNumberStyleAccess().getNumberStyleKeyword_1()); 
+            }
+            match(input,41,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyNumberStyleAccess().getNumberStyleKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyNumberStyle__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyNumberStyle__Group__2"
+    // InternalGridSource.g:2622:1: rule__PropertyNumberStyle__Group__2 : rule__PropertyNumberStyle__Group__2__Impl rule__PropertyNumberStyle__Group__3 ;
+    public final void rule__PropertyNumberStyle__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2626:1: ( rule__PropertyNumberStyle__Group__2__Impl rule__PropertyNumberStyle__Group__3 )
+            // InternalGridSource.g:2627:2: rule__PropertyNumberStyle__Group__2__Impl rule__PropertyNumberStyle__Group__3
+            {
+            pushFollow(FOLLOW_24);
+            rule__PropertyNumberStyle__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyNumberStyle__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyNumberStyle__Group__2"
+
+
+    // $ANTLR start "rule__PropertyNumberStyle__Group__2__Impl"
+    // InternalGridSource.g:2634:1: rule__PropertyNumberStyle__Group__2__Impl : ( 'format' ) ;
+    public final void rule__PropertyNumberStyle__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2638:1: ( ( 'format' ) )
+            // InternalGridSource.g:2639:1: ( 'format' )
+            {
+            // InternalGridSource.g:2639:1: ( 'format' )
+            // InternalGridSource.g:2640:2: 'format'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyNumberStyleAccess().getFormatKeyword_2()); 
+            }
+            match(input,40,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyNumberStyleAccess().getFormatKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyNumberStyle__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyNumberStyle__Group__3"
+    // InternalGridSource.g:2649:1: rule__PropertyNumberStyle__Group__3 : rule__PropertyNumberStyle__Group__3__Impl ;
+    public final void rule__PropertyNumberStyle__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2653:1: ( rule__PropertyNumberStyle__Group__3__Impl )
+            // InternalGridSource.g:2654:2: rule__PropertyNumberStyle__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyNumberStyle__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyNumberStyle__Group__3"
+
+
+    // $ANTLR start "rule__PropertyNumberStyle__Group__3__Impl"
+    // InternalGridSource.g:2660:1: rule__PropertyNumberStyle__Group__3__Impl : ( ( rule__PropertyNumberStyle__NumberFormatAssignment_3 ) ) ;
+    public final void rule__PropertyNumberStyle__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2664:1: ( ( ( rule__PropertyNumberStyle__NumberFormatAssignment_3 ) ) )
+            // InternalGridSource.g:2665:1: ( ( rule__PropertyNumberStyle__NumberFormatAssignment_3 ) )
+            {
+            // InternalGridSource.g:2665:1: ( ( rule__PropertyNumberStyle__NumberFormatAssignment_3 ) )
+            // InternalGridSource.g:2666:2: ( rule__PropertyNumberStyle__NumberFormatAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatAssignment_3()); 
+            }
+            // InternalGridSource.g:2667:2: ( rule__PropertyNumberStyle__NumberFormatAssignment_3 )
+            // InternalGridSource.g:2667:3: rule__PropertyNumberStyle__NumberFormatAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyNumberStyle__NumberFormatAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyNumberStyle__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyProgressbarStyle__Group__0"
+    // InternalGridSource.g:2676:1: rule__PropertyProgressbarStyle__Group__0 : rule__PropertyProgressbarStyle__Group__0__Impl rule__PropertyProgressbarStyle__Group__1 ;
+    public final void rule__PropertyProgressbarStyle__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2680:1: ( rule__PropertyProgressbarStyle__Group__0__Impl rule__PropertyProgressbarStyle__Group__1 )
+            // InternalGridSource.g:2681:2: rule__PropertyProgressbarStyle__Group__0__Impl rule__PropertyProgressbarStyle__Group__1
+            {
+            pushFollow(FOLLOW_30);
+            rule__PropertyProgressbarStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyProgressbarStyle__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyProgressbarStyle__Group__0"
+
+
+    // $ANTLR start "rule__PropertyProgressbarStyle__Group__0__Impl"
+    // InternalGridSource.g:2688:1: rule__PropertyProgressbarStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyProgressbarStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2692:1: ( ( () ) )
+            // InternalGridSource.g:2693:1: ( () )
+            {
+            // InternalGridSource.g:2693:1: ( () )
+            // InternalGridSource.g:2694:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyProgressbarStyleAccess().getCxGridPropProgressbarStyleAction_0()); 
+            }
+            // InternalGridSource.g:2695:2: ()
+            // InternalGridSource.g:2695:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyProgressbarStyleAccess().getCxGridPropProgressbarStyleAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyProgressbarStyle__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyProgressbarStyle__Group__1"
+    // InternalGridSource.g:2703:1: rule__PropertyProgressbarStyle__Group__1 : rule__PropertyProgressbarStyle__Group__1__Impl rule__PropertyProgressbarStyle__Group__2 ;
+    public final void rule__PropertyProgressbarStyle__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2707:1: ( rule__PropertyProgressbarStyle__Group__1__Impl rule__PropertyProgressbarStyle__Group__2 )
+            // InternalGridSource.g:2708:2: rule__PropertyProgressbarStyle__Group__1__Impl rule__PropertyProgressbarStyle__Group__2
+            {
+            pushFollow(FOLLOW_31);
+            rule__PropertyProgressbarStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyProgressbarStyle__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyProgressbarStyle__Group__1"
+
+
+    // $ANTLR start "rule__PropertyProgressbarStyle__Group__1__Impl"
+    // InternalGridSource.g:2715:1: rule__PropertyProgressbarStyle__Group__1__Impl : ( 'progressbarStyle' ) ;
+    public final void rule__PropertyProgressbarStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2719:1: ( ( 'progressbarStyle' ) )
+            // InternalGridSource.g:2720:1: ( 'progressbarStyle' )
+            {
+            // InternalGridSource.g:2720:1: ( 'progressbarStyle' )
+            // InternalGridSource.g:2721:2: 'progressbarStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyProgressbarStyleAccess().getProgressbarStyleKeyword_1()); 
+            }
+            match(input,42,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyProgressbarStyleAccess().getProgressbarStyleKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyProgressbarStyle__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyProgressbarStyle__Group__2"
+    // InternalGridSource.g:2730:1: rule__PropertyProgressbarStyle__Group__2 : rule__PropertyProgressbarStyle__Group__2__Impl rule__PropertyProgressbarStyle__Group__3 ;
+    public final void rule__PropertyProgressbarStyle__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2734:1: ( rule__PropertyProgressbarStyle__Group__2__Impl rule__PropertyProgressbarStyle__Group__3 )
+            // InternalGridSource.g:2735:2: rule__PropertyProgressbarStyle__Group__2__Impl rule__PropertyProgressbarStyle__Group__3
+            {
+            pushFollow(FOLLOW_32);
+            rule__PropertyProgressbarStyle__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyProgressbarStyle__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyProgressbarStyle__Group__2"
+
+
+    // $ANTLR start "rule__PropertyProgressbarStyle__Group__2__Impl"
+    // InternalGridSource.g:2742:1: rule__PropertyProgressbarStyle__Group__2__Impl : ( 'max' ) ;
+    public final void rule__PropertyProgressbarStyle__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2746:1: ( ( 'max' ) )
+            // InternalGridSource.g:2747:1: ( 'max' )
+            {
+            // InternalGridSource.g:2747:1: ( 'max' )
+            // InternalGridSource.g:2748:2: 'max'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyProgressbarStyleAccess().getMaxKeyword_2()); 
+            }
+            match(input,43,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyProgressbarStyleAccess().getMaxKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyProgressbarStyle__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyProgressbarStyle__Group__3"
+    // InternalGridSource.g:2757:1: rule__PropertyProgressbarStyle__Group__3 : rule__PropertyProgressbarStyle__Group__3__Impl ;
+    public final void rule__PropertyProgressbarStyle__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2761:1: ( rule__PropertyProgressbarStyle__Group__3__Impl )
+            // InternalGridSource.g:2762:2: rule__PropertyProgressbarStyle__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyProgressbarStyle__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyProgressbarStyle__Group__3"
+
+
+    // $ANTLR start "rule__PropertyProgressbarStyle__Group__3__Impl"
+    // InternalGridSource.g:2768:1: rule__PropertyProgressbarStyle__Group__3__Impl : ( ( rule__PropertyProgressbarStyle__MaxValueAssignment_3 ) ) ;
+    public final void rule__PropertyProgressbarStyle__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2772:1: ( ( ( rule__PropertyProgressbarStyle__MaxValueAssignment_3 ) ) )
+            // InternalGridSource.g:2773:1: ( ( rule__PropertyProgressbarStyle__MaxValueAssignment_3 ) )
+            {
+            // InternalGridSource.g:2773:1: ( ( rule__PropertyProgressbarStyle__MaxValueAssignment_3 ) )
+            // InternalGridSource.g:2774:2: ( rule__PropertyProgressbarStyle__MaxValueAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueAssignment_3()); 
+            }
+            // InternalGridSource.g:2775:2: ( rule__PropertyProgressbarStyle__MaxValueAssignment_3 )
+            // InternalGridSource.g:2775:3: rule__PropertyProgressbarStyle__MaxValueAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyProgressbarStyle__MaxValueAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyProgressbarStyle__Group__3__Impl"
+
+
+    // $ANTLR start "rule__GridPropIndicatorStyle__Group__0"
+    // InternalGridSource.g:2784:1: rule__GridPropIndicatorStyle__Group__0 : rule__GridPropIndicatorStyle__Group__0__Impl rule__GridPropIndicatorStyle__Group__1 ;
+    public final void rule__GridPropIndicatorStyle__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2788:1: ( rule__GridPropIndicatorStyle__Group__0__Impl rule__GridPropIndicatorStyle__Group__1 )
+            // InternalGridSource.g:2789:2: rule__GridPropIndicatorStyle__Group__0__Impl rule__GridPropIndicatorStyle__Group__1
+            {
+            pushFollow(FOLLOW_20);
+            rule__GridPropIndicatorStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__GridPropIndicatorStyle__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GridPropIndicatorStyle__Group__0"
+
+
+    // $ANTLR start "rule__GridPropIndicatorStyle__Group__0__Impl"
+    // InternalGridSource.g:2796:1: rule__GridPropIndicatorStyle__Group__0__Impl : ( () ) ;
+    public final void rule__GridPropIndicatorStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2800:1: ( ( () ) )
+            // InternalGridSource.g:2801:1: ( () )
+            {
+            // InternalGridSource.g:2801:1: ( () )
+            // InternalGridSource.g:2802:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getCxGridPropIndicatorStyleAction_0()); 
+            }
+            // InternalGridSource.g:2803:2: ()
+            // InternalGridSource.g:2803:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGridPropIndicatorStyleAccess().getCxGridPropIndicatorStyleAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GridPropIndicatorStyle__Group__0__Impl"
+
+
+    // $ANTLR start "rule__GridPropIndicatorStyle__Group__1"
+    // InternalGridSource.g:2811:1: rule__GridPropIndicatorStyle__Group__1 : rule__GridPropIndicatorStyle__Group__1__Impl rule__GridPropIndicatorStyle__Group__2 ;
+    public final void rule__GridPropIndicatorStyle__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2815:1: ( rule__GridPropIndicatorStyle__Group__1__Impl rule__GridPropIndicatorStyle__Group__2 )
+            // InternalGridSource.g:2816:2: rule__GridPropIndicatorStyle__Group__1__Impl rule__GridPropIndicatorStyle__Group__2
+            {
+            pushFollow(FOLLOW_33);
+            rule__GridPropIndicatorStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__GridPropIndicatorStyle__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GridPropIndicatorStyle__Group__1"
+
+
+    // $ANTLR start "rule__GridPropIndicatorStyle__Group__1__Impl"
+    // InternalGridSource.g:2823:1: rule__GridPropIndicatorStyle__Group__1__Impl : ( 'indicatorStyle' ) ;
+    public final void rule__GridPropIndicatorStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2827:1: ( ( 'indicatorStyle' ) )
+            // InternalGridSource.g:2828:1: ( 'indicatorStyle' )
+            {
+            // InternalGridSource.g:2828:1: ( 'indicatorStyle' )
+            // InternalGridSource.g:2829:2: 'indicatorStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getIndicatorStyleKeyword_1()); 
+            }
+            match(input,44,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGridPropIndicatorStyleAccess().getIndicatorStyleKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GridPropIndicatorStyle__Group__1__Impl"
+
+
+    // $ANTLR start "rule__GridPropIndicatorStyle__Group__2"
+    // InternalGridSource.g:2838:1: rule__GridPropIndicatorStyle__Group__2 : rule__GridPropIndicatorStyle__Group__2__Impl rule__GridPropIndicatorStyle__Group__3 ;
+    public final void rule__GridPropIndicatorStyle__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2842:1: ( rule__GridPropIndicatorStyle__Group__2__Impl rule__GridPropIndicatorStyle__Group__3 )
+            // InternalGridSource.g:2843:2: rule__GridPropIndicatorStyle__Group__2__Impl rule__GridPropIndicatorStyle__Group__3
+            {
+            pushFollow(FOLLOW_32);
+            rule__GridPropIndicatorStyle__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__GridPropIndicatorStyle__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GridPropIndicatorStyle__Group__2"
+
+
+    // $ANTLR start "rule__GridPropIndicatorStyle__Group__2__Impl"
+    // InternalGridSource.g:2850:1: rule__GridPropIndicatorStyle__Group__2__Impl : ( 'greenFrom' ) ;
+    public final void rule__GridPropIndicatorStyle__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2854:1: ( ( 'greenFrom' ) )
+            // InternalGridSource.g:2855:1: ( 'greenFrom' )
+            {
+            // InternalGridSource.g:2855:1: ( 'greenFrom' )
+            // InternalGridSource.g:2856:2: 'greenFrom'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getGreenFromKeyword_2()); 
+            }
+            match(input,45,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGridPropIndicatorStyleAccess().getGreenFromKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GridPropIndicatorStyle__Group__2__Impl"
+
+
+    // $ANTLR start "rule__GridPropIndicatorStyle__Group__3"
+    // InternalGridSource.g:2865:1: rule__GridPropIndicatorStyle__Group__3 : rule__GridPropIndicatorStyle__Group__3__Impl rule__GridPropIndicatorStyle__Group__4 ;
+    public final void rule__GridPropIndicatorStyle__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2869:1: ( rule__GridPropIndicatorStyle__Group__3__Impl rule__GridPropIndicatorStyle__Group__4 )
+            // InternalGridSource.g:2870:2: rule__GridPropIndicatorStyle__Group__3__Impl rule__GridPropIndicatorStyle__Group__4
+            {
+            pushFollow(FOLLOW_34);
+            rule__GridPropIndicatorStyle__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__GridPropIndicatorStyle__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GridPropIndicatorStyle__Group__3"
+
+
+    // $ANTLR start "rule__GridPropIndicatorStyle__Group__3__Impl"
+    // InternalGridSource.g:2877:1: rule__GridPropIndicatorStyle__Group__3__Impl : ( ( rule__GridPropIndicatorStyle__GreenStartsAssignment_3 ) ) ;
+    public final void rule__GridPropIndicatorStyle__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2881:1: ( ( ( rule__GridPropIndicatorStyle__GreenStartsAssignment_3 ) ) )
+            // InternalGridSource.g:2882:1: ( ( rule__GridPropIndicatorStyle__GreenStartsAssignment_3 ) )
+            {
+            // InternalGridSource.g:2882:1: ( ( rule__GridPropIndicatorStyle__GreenStartsAssignment_3 ) )
+            // InternalGridSource.g:2883:2: ( rule__GridPropIndicatorStyle__GreenStartsAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsAssignment_3()); 
+            }
+            // InternalGridSource.g:2884:2: ( rule__GridPropIndicatorStyle__GreenStartsAssignment_3 )
+            // InternalGridSource.g:2884:3: rule__GridPropIndicatorStyle__GreenStartsAssignment_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__GridPropIndicatorStyle__GreenStartsAssignment_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsAssignment_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GridPropIndicatorStyle__Group__3__Impl"
+
+
+    // $ANTLR start "rule__GridPropIndicatorStyle__Group__4"
+    // InternalGridSource.g:2892:1: rule__GridPropIndicatorStyle__Group__4 : rule__GridPropIndicatorStyle__Group__4__Impl rule__GridPropIndicatorStyle__Group__5 ;
+    public final void rule__GridPropIndicatorStyle__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2896:1: ( rule__GridPropIndicatorStyle__Group__4__Impl rule__GridPropIndicatorStyle__Group__5 )
+            // InternalGridSource.g:2897:2: rule__GridPropIndicatorStyle__Group__4__Impl rule__GridPropIndicatorStyle__Group__5
+            {
+            pushFollow(FOLLOW_32);
+            rule__GridPropIndicatorStyle__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__GridPropIndicatorStyle__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GridPropIndicatorStyle__Group__4"
+
+
+    // $ANTLR start "rule__GridPropIndicatorStyle__Group__4__Impl"
+    // InternalGridSource.g:2904:1: rule__GridPropIndicatorStyle__Group__4__Impl : ( 'redUntil' ) ;
+    public final void rule__GridPropIndicatorStyle__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2908:1: ( ( 'redUntil' ) )
+            // InternalGridSource.g:2909:1: ( 'redUntil' )
+            {
+            // InternalGridSource.g:2909:1: ( 'redUntil' )
+            // InternalGridSource.g:2910:2: 'redUntil'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getRedUntilKeyword_4()); 
+            }
+            match(input,46,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGridPropIndicatorStyleAccess().getRedUntilKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GridPropIndicatorStyle__Group__4__Impl"
+
+
+    // $ANTLR start "rule__GridPropIndicatorStyle__Group__5"
+    // InternalGridSource.g:2919:1: rule__GridPropIndicatorStyle__Group__5 : rule__GridPropIndicatorStyle__Group__5__Impl ;
+    public final void rule__GridPropIndicatorStyle__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2923:1: ( rule__GridPropIndicatorStyle__Group__5__Impl )
+            // InternalGridSource.g:2924:2: rule__GridPropIndicatorStyle__Group__5__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__GridPropIndicatorStyle__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GridPropIndicatorStyle__Group__5"
+
+
+    // $ANTLR start "rule__GridPropIndicatorStyle__Group__5__Impl"
+    // InternalGridSource.g:2930:1: rule__GridPropIndicatorStyle__Group__5__Impl : ( ( rule__GridPropIndicatorStyle__RedEndsAssignment_5 ) ) ;
+    public final void rule__GridPropIndicatorStyle__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2934:1: ( ( ( rule__GridPropIndicatorStyle__RedEndsAssignment_5 ) ) )
+            // InternalGridSource.g:2935:1: ( ( rule__GridPropIndicatorStyle__RedEndsAssignment_5 ) )
+            {
+            // InternalGridSource.g:2935:1: ( ( rule__GridPropIndicatorStyle__RedEndsAssignment_5 ) )
+            // InternalGridSource.g:2936:2: ( rule__GridPropIndicatorStyle__RedEndsAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsAssignment_5()); 
+            }
+            // InternalGridSource.g:2937:2: ( rule__GridPropIndicatorStyle__RedEndsAssignment_5 )
+            // InternalGridSource.g:2937:3: rule__GridPropIndicatorStyle__RedEndsAssignment_5
+            {
+            pushFollow(FOLLOW_2);
+            rule__GridPropIndicatorStyle__RedEndsAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GridPropIndicatorStyle__Group__5__Impl"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__0"
+    // InternalGridSource.g:2946:1: rule__PropertyQuantityStyle__Group__0 : rule__PropertyQuantityStyle__Group__0__Impl rule__PropertyQuantityStyle__Group__1 ;
+    public final void rule__PropertyQuantityStyle__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2950:1: ( rule__PropertyQuantityStyle__Group__0__Impl rule__PropertyQuantityStyle__Group__1 )
+            // InternalGridSource.g:2951:2: rule__PropertyQuantityStyle__Group__0__Impl rule__PropertyQuantityStyle__Group__1
+            {
+            pushFollow(FOLLOW_35);
+            rule__PropertyQuantityStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__0"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__0__Impl"
+    // InternalGridSource.g:2958:1: rule__PropertyQuantityStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyQuantityStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2962:1: ( ( () ) )
+            // InternalGridSource.g:2963:1: ( () )
+            {
+            // InternalGridSource.g:2963:1: ( () )
+            // InternalGridSource.g:2964:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getCxGridPropQuantityStyleAction_0()); 
+            }
+            // InternalGridSource.g:2965:2: ()
+            // InternalGridSource.g:2965:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getCxGridPropQuantityStyleAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__1"
+    // InternalGridSource.g:2973:1: rule__PropertyQuantityStyle__Group__1 : rule__PropertyQuantityStyle__Group__1__Impl rule__PropertyQuantityStyle__Group__2 ;
+    public final void rule__PropertyQuantityStyle__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2977:1: ( rule__PropertyQuantityStyle__Group__1__Impl rule__PropertyQuantityStyle__Group__2 )
+            // InternalGridSource.g:2978:2: rule__PropertyQuantityStyle__Group__1__Impl rule__PropertyQuantityStyle__Group__2
+            {
+            pushFollow(FOLLOW_36);
+            rule__PropertyQuantityStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__1"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__1__Impl"
+    // InternalGridSource.g:2985:1: rule__PropertyQuantityStyle__Group__1__Impl : ( 'quantityStyle' ) ;
+    public final void rule__PropertyQuantityStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:2989:1: ( ( 'quantityStyle' ) )
+            // InternalGridSource.g:2990:1: ( 'quantityStyle' )
+            {
+            // InternalGridSource.g:2990:1: ( 'quantityStyle' )
+            // InternalGridSource.g:2991:2: 'quantityStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getQuantityStyleKeyword_1()); 
+            }
+            match(input,47,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getQuantityStyleKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__2"
+    // InternalGridSource.g:3000:1: rule__PropertyQuantityStyle__Group__2 : rule__PropertyQuantityStyle__Group__2__Impl rule__PropertyQuantityStyle__Group__3 ;
+    public final void rule__PropertyQuantityStyle__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3004:1: ( rule__PropertyQuantityStyle__Group__2__Impl rule__PropertyQuantityStyle__Group__3 )
+            // InternalGridSource.g:3005:2: rule__PropertyQuantityStyle__Group__2__Impl rule__PropertyQuantityStyle__Group__3
+            {
+            pushFollow(FOLLOW_36);
+            rule__PropertyQuantityStyle__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__2"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__2__Impl"
+    // InternalGridSource.g:3012:1: rule__PropertyQuantityStyle__Group__2__Impl : ( ( rule__PropertyQuantityStyle__HtmlPatternAssignment_2 )? ) ;
+    public final void rule__PropertyQuantityStyle__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3016:1: ( ( ( rule__PropertyQuantityStyle__HtmlPatternAssignment_2 )? ) )
+            // InternalGridSource.g:3017:1: ( ( rule__PropertyQuantityStyle__HtmlPatternAssignment_2 )? )
+            {
+            // InternalGridSource.g:3017:1: ( ( rule__PropertyQuantityStyle__HtmlPatternAssignment_2 )? )
+            // InternalGridSource.g:3018:2: ( rule__PropertyQuantityStyle__HtmlPatternAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternAssignment_2()); 
+            }
+            // InternalGridSource.g:3019:2: ( rule__PropertyQuantityStyle__HtmlPatternAssignment_2 )?
+            int alt16=2;
+            int LA16_0 = input.LA(1);
+
+            if ( (LA16_0==RULE_STRING) ) {
+                alt16=1;
+            }
+            switch (alt16) {
+                case 1 :
+                    // InternalGridSource.g:3019:3: rule__PropertyQuantityStyle__HtmlPatternAssignment_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyQuantityStyle__HtmlPatternAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__3"
+    // InternalGridSource.g:3027:1: rule__PropertyQuantityStyle__Group__3 : rule__PropertyQuantityStyle__Group__3__Impl rule__PropertyQuantityStyle__Group__4 ;
+    public final void rule__PropertyQuantityStyle__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3031:1: ( rule__PropertyQuantityStyle__Group__3__Impl rule__PropertyQuantityStyle__Group__4 )
+            // InternalGridSource.g:3032:2: rule__PropertyQuantityStyle__Group__3__Impl rule__PropertyQuantityStyle__Group__4
+            {
+            pushFollow(FOLLOW_17);
+            rule__PropertyQuantityStyle__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__3"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__3__Impl"
+    // InternalGridSource.g:3039:1: rule__PropertyQuantityStyle__Group__3__Impl : ( 'value' ) ;
+    public final void rule__PropertyQuantityStyle__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3043:1: ( ( 'value' ) )
+            // InternalGridSource.g:3044:1: ( 'value' )
+            {
+            // InternalGridSource.g:3044:1: ( 'value' )
+            // InternalGridSource.g:3045:2: 'value'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getValueKeyword_3()); 
+            }
+            match(input,48,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getValueKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__4"
+    // InternalGridSource.g:3054:1: rule__PropertyQuantityStyle__Group__4 : rule__PropertyQuantityStyle__Group__4__Impl rule__PropertyQuantityStyle__Group__5 ;
+    public final void rule__PropertyQuantityStyle__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3058:1: ( rule__PropertyQuantityStyle__Group__4__Impl rule__PropertyQuantityStyle__Group__5 )
+            // InternalGridSource.g:3059:2: rule__PropertyQuantityStyle__Group__4__Impl rule__PropertyQuantityStyle__Group__5
+            {
+            pushFollow(FOLLOW_4);
+            rule__PropertyQuantityStyle__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__4"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__4__Impl"
+    // InternalGridSource.g:3066:1: rule__PropertyQuantityStyle__Group__4__Impl : ( '=' ) ;
+    public final void rule__PropertyQuantityStyle__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3070:1: ( ( '=' ) )
+            // InternalGridSource.g:3071:1: ( '=' )
+            {
+            // InternalGridSource.g:3071:1: ( '=' )
+            // InternalGridSource.g:3072:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_4()); 
+            }
+            match(input,30,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__4__Impl"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__5"
+    // InternalGridSource.g:3081:1: rule__PropertyQuantityStyle__Group__5 : rule__PropertyQuantityStyle__Group__5__Impl rule__PropertyQuantityStyle__Group__6 ;
+    public final void rule__PropertyQuantityStyle__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3085:1: ( rule__PropertyQuantityStyle__Group__5__Impl rule__PropertyQuantityStyle__Group__6 )
+            // InternalGridSource.g:3086:2: rule__PropertyQuantityStyle__Group__5__Impl rule__PropertyQuantityStyle__Group__6
+            {
+            pushFollow(FOLLOW_37);
+            rule__PropertyQuantityStyle__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__5"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__5__Impl"
+    // InternalGridSource.g:3093:1: rule__PropertyQuantityStyle__Group__5__Impl : ( ( rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5 ) ) ;
+    public final void rule__PropertyQuantityStyle__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3097:1: ( ( ( rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5 ) ) )
+            // InternalGridSource.g:3098:1: ( ( rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5 ) )
+            {
+            // InternalGridSource.g:3098:1: ( ( rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5 ) )
+            // InternalGridSource.g:3099:2: ( rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathAssignment_5()); 
+            }
+            // InternalGridSource.g:3100:2: ( rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5 )
+            // InternalGridSource.g:3100:3: rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__5__Impl"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__6"
+    // InternalGridSource.g:3108:1: rule__PropertyQuantityStyle__Group__6 : rule__PropertyQuantityStyle__Group__6__Impl rule__PropertyQuantityStyle__Group__7 ;
+    public final void rule__PropertyQuantityStyle__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3112:1: ( rule__PropertyQuantityStyle__Group__6__Impl rule__PropertyQuantityStyle__Group__7 )
+            // InternalGridSource.g:3113:2: rule__PropertyQuantityStyle__Group__6__Impl rule__PropertyQuantityStyle__Group__7
+            {
+            pushFollow(FOLLOW_37);
+            rule__PropertyQuantityStyle__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__6"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__6__Impl"
+    // InternalGridSource.g:3120:1: rule__PropertyQuantityStyle__Group__6__Impl : ( ( rule__PropertyQuantityStyle__Group_6__0 )? ) ;
+    public final void rule__PropertyQuantityStyle__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3124:1: ( ( ( rule__PropertyQuantityStyle__Group_6__0 )? ) )
+            // InternalGridSource.g:3125:1: ( ( rule__PropertyQuantityStyle__Group_6__0 )? )
+            {
+            // InternalGridSource.g:3125:1: ( ( rule__PropertyQuantityStyle__Group_6__0 )? )
+            // InternalGridSource.g:3126:2: ( rule__PropertyQuantityStyle__Group_6__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getGroup_6()); 
+            }
+            // InternalGridSource.g:3127:2: ( rule__PropertyQuantityStyle__Group_6__0 )?
+            int alt17=2;
+            int LA17_0 = input.LA(1);
+
+            if ( (LA17_0==50) ) {
+                alt17=1;
+            }
+            switch (alt17) {
+                case 1 :
+                    // InternalGridSource.g:3127:3: rule__PropertyQuantityStyle__Group_6__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyQuantityStyle__Group_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getGroup_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__6__Impl"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__7"
+    // InternalGridSource.g:3135:1: rule__PropertyQuantityStyle__Group__7 : rule__PropertyQuantityStyle__Group__7__Impl rule__PropertyQuantityStyle__Group__8 ;
+    public final void rule__PropertyQuantityStyle__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3139:1: ( rule__PropertyQuantityStyle__Group__7__Impl rule__PropertyQuantityStyle__Group__8 )
+            // InternalGridSource.g:3140:2: rule__PropertyQuantityStyle__Group__7__Impl rule__PropertyQuantityStyle__Group__8
+            {
+            pushFollow(FOLLOW_17);
+            rule__PropertyQuantityStyle__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__7"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__7__Impl"
+    // InternalGridSource.g:3147:1: rule__PropertyQuantityStyle__Group__7__Impl : ( 'uom' ) ;
+    public final void rule__PropertyQuantityStyle__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3151:1: ( ( 'uom' ) )
+            // InternalGridSource.g:3152:1: ( 'uom' )
+            {
+            // InternalGridSource.g:3152:1: ( 'uom' )
+            // InternalGridSource.g:3153:2: 'uom'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getUomKeyword_7()); 
+            }
+            match(input,49,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getUomKeyword_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__7__Impl"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__8"
+    // InternalGridSource.g:3162:1: rule__PropertyQuantityStyle__Group__8 : rule__PropertyQuantityStyle__Group__8__Impl rule__PropertyQuantityStyle__Group__9 ;
+    public final void rule__PropertyQuantityStyle__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3166:1: ( rule__PropertyQuantityStyle__Group__8__Impl rule__PropertyQuantityStyle__Group__9 )
+            // InternalGridSource.g:3167:2: rule__PropertyQuantityStyle__Group__8__Impl rule__PropertyQuantityStyle__Group__9
+            {
+            pushFollow(FOLLOW_4);
+            rule__PropertyQuantityStyle__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__8"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__8__Impl"
+    // InternalGridSource.g:3174:1: rule__PropertyQuantityStyle__Group__8__Impl : ( '=' ) ;
+    public final void rule__PropertyQuantityStyle__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3178:1: ( ( '=' ) )
+            // InternalGridSource.g:3179:1: ( '=' )
+            {
+            // InternalGridSource.g:3179:1: ( '=' )
+            // InternalGridSource.g:3180:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_8()); 
+            }
+            match(input,30,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__8__Impl"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__9"
+    // InternalGridSource.g:3189:1: rule__PropertyQuantityStyle__Group__9 : rule__PropertyQuantityStyle__Group__9__Impl ;
+    public final void rule__PropertyQuantityStyle__Group__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3193:1: ( rule__PropertyQuantityStyle__Group__9__Impl )
+            // InternalGridSource.g:3194:2: rule__PropertyQuantityStyle__Group__9__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__9"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group__9__Impl"
+    // InternalGridSource.g:3200:1: rule__PropertyQuantityStyle__Group__9__Impl : ( ( rule__PropertyQuantityStyle__UomPropertyPathAssignment_9 ) ) ;
+    public final void rule__PropertyQuantityStyle__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3204:1: ( ( ( rule__PropertyQuantityStyle__UomPropertyPathAssignment_9 ) ) )
+            // InternalGridSource.g:3205:1: ( ( rule__PropertyQuantityStyle__UomPropertyPathAssignment_9 ) )
+            {
+            // InternalGridSource.g:3205:1: ( ( rule__PropertyQuantityStyle__UomPropertyPathAssignment_9 ) )
+            // InternalGridSource.g:3206:2: ( rule__PropertyQuantityStyle__UomPropertyPathAssignment_9 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathAssignment_9()); 
+            }
+            // InternalGridSource.g:3207:2: ( rule__PropertyQuantityStyle__UomPropertyPathAssignment_9 )
+            // InternalGridSource.g:3207:3: rule__PropertyQuantityStyle__UomPropertyPathAssignment_9
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__UomPropertyPathAssignment_9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathAssignment_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group__9__Impl"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group_6__0"
+    // InternalGridSource.g:3216:1: rule__PropertyQuantityStyle__Group_6__0 : rule__PropertyQuantityStyle__Group_6__0__Impl rule__PropertyQuantityStyle__Group_6__1 ;
+    public final void rule__PropertyQuantityStyle__Group_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3220:1: ( rule__PropertyQuantityStyle__Group_6__0__Impl rule__PropertyQuantityStyle__Group_6__1 )
+            // InternalGridSource.g:3221:2: rule__PropertyQuantityStyle__Group_6__0__Impl rule__PropertyQuantityStyle__Group_6__1
+            {
+            pushFollow(FOLLOW_28);
+            rule__PropertyQuantityStyle__Group_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group_6__0"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group_6__0__Impl"
+    // InternalGridSource.g:3228:1: rule__PropertyQuantityStyle__Group_6__0__Impl : ( '(' ) ;
+    public final void rule__PropertyQuantityStyle__Group_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3232:1: ( ( '(' ) )
+            // InternalGridSource.g:3233:1: ( '(' )
+            {
+            // InternalGridSource.g:3233:1: ( '(' )
+            // InternalGridSource.g:3234:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getLeftParenthesisKeyword_6_0()); 
+            }
+            match(input,50,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getLeftParenthesisKeyword_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group_6__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group_6__1"
+    // InternalGridSource.g:3243:1: rule__PropertyQuantityStyle__Group_6__1 : rule__PropertyQuantityStyle__Group_6__1__Impl rule__PropertyQuantityStyle__Group_6__2 ;
+    public final void rule__PropertyQuantityStyle__Group_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3247:1: ( rule__PropertyQuantityStyle__Group_6__1__Impl rule__PropertyQuantityStyle__Group_6__2 )
+            // InternalGridSource.g:3248:2: rule__PropertyQuantityStyle__Group_6__1__Impl rule__PropertyQuantityStyle__Group_6__2
+            {
+            pushFollow(FOLLOW_24);
+            rule__PropertyQuantityStyle__Group_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group_6__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group_6__1"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group_6__1__Impl"
+    // InternalGridSource.g:3255:1: rule__PropertyQuantityStyle__Group_6__1__Impl : ( 'format' ) ;
+    public final void rule__PropertyQuantityStyle__Group_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3259:1: ( ( 'format' ) )
+            // InternalGridSource.g:3260:1: ( 'format' )
+            {
+            // InternalGridSource.g:3260:1: ( 'format' )
+            // InternalGridSource.g:3261:2: 'format'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getFormatKeyword_6_1()); 
+            }
+            match(input,40,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getFormatKeyword_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group_6__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group_6__2"
+    // InternalGridSource.g:3270:1: rule__PropertyQuantityStyle__Group_6__2 : rule__PropertyQuantityStyle__Group_6__2__Impl rule__PropertyQuantityStyle__Group_6__3 ;
+    public final void rule__PropertyQuantityStyle__Group_6__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3274:1: ( rule__PropertyQuantityStyle__Group_6__2__Impl rule__PropertyQuantityStyle__Group_6__3 )
+            // InternalGridSource.g:3275:2: rule__PropertyQuantityStyle__Group_6__2__Impl rule__PropertyQuantityStyle__Group_6__3
+            {
+            pushFollow(FOLLOW_38);
+            rule__PropertyQuantityStyle__Group_6__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group_6__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group_6__2"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group_6__2__Impl"
+    // InternalGridSource.g:3282:1: rule__PropertyQuantityStyle__Group_6__2__Impl : ( ( rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2 ) ) ;
+    public final void rule__PropertyQuantityStyle__Group_6__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3286:1: ( ( ( rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2 ) ) )
+            // InternalGridSource.g:3287:1: ( ( rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2 ) )
+            {
+            // InternalGridSource.g:3287:1: ( ( rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2 ) )
+            // InternalGridSource.g:3288:2: ( rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatAssignment_6_2()); 
+            }
+            // InternalGridSource.g:3289:2: ( rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2 )
+            // InternalGridSource.g:3289:3: rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatAssignment_6_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group_6__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group_6__3"
+    // InternalGridSource.g:3297:1: rule__PropertyQuantityStyle__Group_6__3 : rule__PropertyQuantityStyle__Group_6__3__Impl ;
+    public final void rule__PropertyQuantityStyle__Group_6__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3301:1: ( rule__PropertyQuantityStyle__Group_6__3__Impl )
+            // InternalGridSource.g:3302:2: rule__PropertyQuantityStyle__Group_6__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyQuantityStyle__Group_6__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group_6__3"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__Group_6__3__Impl"
+    // InternalGridSource.g:3308:1: rule__PropertyQuantityStyle__Group_6__3__Impl : ( ')' ) ;
+    public final void rule__PropertyQuantityStyle__Group_6__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3312:1: ( ( ')' ) )
+            // InternalGridSource.g:3313:1: ( ')' )
+            {
+            // InternalGridSource.g:3313:1: ( ')' )
+            // InternalGridSource.g:3314:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getRightParenthesisKeyword_6_3()); 
+            }
+            match(input,51,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getRightParenthesisKeyword_6_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__Group_6__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__0"
+    // InternalGridSource.g:3324:1: rule__PropertyPriceStyle__Group__0 : rule__PropertyPriceStyle__Group__0__Impl rule__PropertyPriceStyle__Group__1 ;
+    public final void rule__PropertyPriceStyle__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3328:1: ( rule__PropertyPriceStyle__Group__0__Impl rule__PropertyPriceStyle__Group__1 )
+            // InternalGridSource.g:3329:2: rule__PropertyPriceStyle__Group__0__Impl rule__PropertyPriceStyle__Group__1
+            {
+            pushFollow(FOLLOW_39);
+            rule__PropertyPriceStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__0"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__0__Impl"
+    // InternalGridSource.g:3336:1: rule__PropertyPriceStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyPriceStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3340:1: ( ( () ) )
+            // InternalGridSource.g:3341:1: ( () )
+            {
+            // InternalGridSource.g:3341:1: ( () )
+            // InternalGridSource.g:3342:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getCxGridPropPriceStyleAction_0()); 
+            }
+            // InternalGridSource.g:3343:2: ()
+            // InternalGridSource.g:3343:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getCxGridPropPriceStyleAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__1"
+    // InternalGridSource.g:3351:1: rule__PropertyPriceStyle__Group__1 : rule__PropertyPriceStyle__Group__1__Impl rule__PropertyPriceStyle__Group__2 ;
+    public final void rule__PropertyPriceStyle__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3355:1: ( rule__PropertyPriceStyle__Group__1__Impl rule__PropertyPriceStyle__Group__2 )
+            // InternalGridSource.g:3356:2: rule__PropertyPriceStyle__Group__1__Impl rule__PropertyPriceStyle__Group__2
+            {
+            pushFollow(FOLLOW_36);
+            rule__PropertyPriceStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__1"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__1__Impl"
+    // InternalGridSource.g:3363:1: rule__PropertyPriceStyle__Group__1__Impl : ( 'priceStyle' ) ;
+    public final void rule__PropertyPriceStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3367:1: ( ( 'priceStyle' ) )
+            // InternalGridSource.g:3368:1: ( 'priceStyle' )
+            {
+            // InternalGridSource.g:3368:1: ( 'priceStyle' )
+            // InternalGridSource.g:3369:2: 'priceStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getPriceStyleKeyword_1()); 
+            }
+            match(input,52,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getPriceStyleKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__2"
+    // InternalGridSource.g:3378:1: rule__PropertyPriceStyle__Group__2 : rule__PropertyPriceStyle__Group__2__Impl rule__PropertyPriceStyle__Group__3 ;
+    public final void rule__PropertyPriceStyle__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3382:1: ( rule__PropertyPriceStyle__Group__2__Impl rule__PropertyPriceStyle__Group__3 )
+            // InternalGridSource.g:3383:2: rule__PropertyPriceStyle__Group__2__Impl rule__PropertyPriceStyle__Group__3
+            {
+            pushFollow(FOLLOW_36);
+            rule__PropertyPriceStyle__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__2"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__2__Impl"
+    // InternalGridSource.g:3390:1: rule__PropertyPriceStyle__Group__2__Impl : ( ( rule__PropertyPriceStyle__HtmlPatternAssignment_2 )? ) ;
+    public final void rule__PropertyPriceStyle__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3394:1: ( ( ( rule__PropertyPriceStyle__HtmlPatternAssignment_2 )? ) )
+            // InternalGridSource.g:3395:1: ( ( rule__PropertyPriceStyle__HtmlPatternAssignment_2 )? )
+            {
+            // InternalGridSource.g:3395:1: ( ( rule__PropertyPriceStyle__HtmlPatternAssignment_2 )? )
+            // InternalGridSource.g:3396:2: ( rule__PropertyPriceStyle__HtmlPatternAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternAssignment_2()); 
+            }
+            // InternalGridSource.g:3397:2: ( rule__PropertyPriceStyle__HtmlPatternAssignment_2 )?
+            int alt18=2;
+            int LA18_0 = input.LA(1);
+
+            if ( (LA18_0==RULE_STRING) ) {
+                alt18=1;
+            }
+            switch (alt18) {
+                case 1 :
+                    // InternalGridSource.g:3397:3: rule__PropertyPriceStyle__HtmlPatternAssignment_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyPriceStyle__HtmlPatternAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__3"
+    // InternalGridSource.g:3405:1: rule__PropertyPriceStyle__Group__3 : rule__PropertyPriceStyle__Group__3__Impl rule__PropertyPriceStyle__Group__4 ;
+    public final void rule__PropertyPriceStyle__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3409:1: ( rule__PropertyPriceStyle__Group__3__Impl rule__PropertyPriceStyle__Group__4 )
+            // InternalGridSource.g:3410:2: rule__PropertyPriceStyle__Group__3__Impl rule__PropertyPriceStyle__Group__4
+            {
+            pushFollow(FOLLOW_17);
+            rule__PropertyPriceStyle__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__3"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__3__Impl"
+    // InternalGridSource.g:3417:1: rule__PropertyPriceStyle__Group__3__Impl : ( 'value' ) ;
+    public final void rule__PropertyPriceStyle__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3421:1: ( ( 'value' ) )
+            // InternalGridSource.g:3422:1: ( 'value' )
+            {
+            // InternalGridSource.g:3422:1: ( 'value' )
+            // InternalGridSource.g:3423:2: 'value'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getValueKeyword_3()); 
+            }
+            match(input,48,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getValueKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__4"
+    // InternalGridSource.g:3432:1: rule__PropertyPriceStyle__Group__4 : rule__PropertyPriceStyle__Group__4__Impl rule__PropertyPriceStyle__Group__5 ;
+    public final void rule__PropertyPriceStyle__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3436:1: ( rule__PropertyPriceStyle__Group__4__Impl rule__PropertyPriceStyle__Group__5 )
+            // InternalGridSource.g:3437:2: rule__PropertyPriceStyle__Group__4__Impl rule__PropertyPriceStyle__Group__5
+            {
+            pushFollow(FOLLOW_4);
+            rule__PropertyPriceStyle__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__4"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__4__Impl"
+    // InternalGridSource.g:3444:1: rule__PropertyPriceStyle__Group__4__Impl : ( '=' ) ;
+    public final void rule__PropertyPriceStyle__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3448:1: ( ( '=' ) )
+            // InternalGridSource.g:3449:1: ( '=' )
+            {
+            // InternalGridSource.g:3449:1: ( '=' )
+            // InternalGridSource.g:3450:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_4()); 
+            }
+            match(input,30,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__4__Impl"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__5"
+    // InternalGridSource.g:3459:1: rule__PropertyPriceStyle__Group__5 : rule__PropertyPriceStyle__Group__5__Impl rule__PropertyPriceStyle__Group__6 ;
+    public final void rule__PropertyPriceStyle__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3463:1: ( rule__PropertyPriceStyle__Group__5__Impl rule__PropertyPriceStyle__Group__6 )
+            // InternalGridSource.g:3464:2: rule__PropertyPriceStyle__Group__5__Impl rule__PropertyPriceStyle__Group__6
+            {
+            pushFollow(FOLLOW_40);
+            rule__PropertyPriceStyle__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__5"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__5__Impl"
+    // InternalGridSource.g:3471:1: rule__PropertyPriceStyle__Group__5__Impl : ( ( rule__PropertyPriceStyle__ValuePropertyPathAssignment_5 ) ) ;
+    public final void rule__PropertyPriceStyle__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3475:1: ( ( ( rule__PropertyPriceStyle__ValuePropertyPathAssignment_5 ) ) )
+            // InternalGridSource.g:3476:1: ( ( rule__PropertyPriceStyle__ValuePropertyPathAssignment_5 ) )
+            {
+            // InternalGridSource.g:3476:1: ( ( rule__PropertyPriceStyle__ValuePropertyPathAssignment_5 ) )
+            // InternalGridSource.g:3477:2: ( rule__PropertyPriceStyle__ValuePropertyPathAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathAssignment_5()); 
+            }
+            // InternalGridSource.g:3478:2: ( rule__PropertyPriceStyle__ValuePropertyPathAssignment_5 )
+            // InternalGridSource.g:3478:3: rule__PropertyPriceStyle__ValuePropertyPathAssignment_5
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__ValuePropertyPathAssignment_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathAssignment_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__5__Impl"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__6"
+    // InternalGridSource.g:3486:1: rule__PropertyPriceStyle__Group__6 : rule__PropertyPriceStyle__Group__6__Impl rule__PropertyPriceStyle__Group__7 ;
+    public final void rule__PropertyPriceStyle__Group__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3490:1: ( rule__PropertyPriceStyle__Group__6__Impl rule__PropertyPriceStyle__Group__7 )
+            // InternalGridSource.g:3491:2: rule__PropertyPriceStyle__Group__6__Impl rule__PropertyPriceStyle__Group__7
+            {
+            pushFollow(FOLLOW_40);
+            rule__PropertyPriceStyle__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group__7();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__6"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__6__Impl"
+    // InternalGridSource.g:3498:1: rule__PropertyPriceStyle__Group__6__Impl : ( ( rule__PropertyPriceStyle__Group_6__0 )? ) ;
+    public final void rule__PropertyPriceStyle__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3502:1: ( ( ( rule__PropertyPriceStyle__Group_6__0 )? ) )
+            // InternalGridSource.g:3503:1: ( ( rule__PropertyPriceStyle__Group_6__0 )? )
+            {
+            // InternalGridSource.g:3503:1: ( ( rule__PropertyPriceStyle__Group_6__0 )? )
+            // InternalGridSource.g:3504:2: ( rule__PropertyPriceStyle__Group_6__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getGroup_6()); 
+            }
+            // InternalGridSource.g:3505:2: ( rule__PropertyPriceStyle__Group_6__0 )?
+            int alt19=2;
+            int LA19_0 = input.LA(1);
+
+            if ( (LA19_0==50) ) {
+                alt19=1;
+            }
+            switch (alt19) {
+                case 1 :
+                    // InternalGridSource.g:3505:3: rule__PropertyPriceStyle__Group_6__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyPriceStyle__Group_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getGroup_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__6__Impl"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__7"
+    // InternalGridSource.g:3513:1: rule__PropertyPriceStyle__Group__7 : rule__PropertyPriceStyle__Group__7__Impl rule__PropertyPriceStyle__Group__8 ;
+    public final void rule__PropertyPriceStyle__Group__7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3517:1: ( rule__PropertyPriceStyle__Group__7__Impl rule__PropertyPriceStyle__Group__8 )
+            // InternalGridSource.g:3518:2: rule__PropertyPriceStyle__Group__7__Impl rule__PropertyPriceStyle__Group__8
+            {
+            pushFollow(FOLLOW_17);
+            rule__PropertyPriceStyle__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group__8();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__7"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__7__Impl"
+    // InternalGridSource.g:3525:1: rule__PropertyPriceStyle__Group__7__Impl : ( 'currency' ) ;
+    public final void rule__PropertyPriceStyle__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3529:1: ( ( 'currency' ) )
+            // InternalGridSource.g:3530:1: ( 'currency' )
+            {
+            // InternalGridSource.g:3530:1: ( 'currency' )
+            // InternalGridSource.g:3531:2: 'currency'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getCurrencyKeyword_7()); 
+            }
+            match(input,53,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getCurrencyKeyword_7()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__7__Impl"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__8"
+    // InternalGridSource.g:3540:1: rule__PropertyPriceStyle__Group__8 : rule__PropertyPriceStyle__Group__8__Impl rule__PropertyPriceStyle__Group__9 ;
+    public final void rule__PropertyPriceStyle__Group__8() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3544:1: ( rule__PropertyPriceStyle__Group__8__Impl rule__PropertyPriceStyle__Group__9 )
+            // InternalGridSource.g:3545:2: rule__PropertyPriceStyle__Group__8__Impl rule__PropertyPriceStyle__Group__9
+            {
+            pushFollow(FOLLOW_4);
+            rule__PropertyPriceStyle__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group__9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__8"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__8__Impl"
+    // InternalGridSource.g:3552:1: rule__PropertyPriceStyle__Group__8__Impl : ( '=' ) ;
+    public final void rule__PropertyPriceStyle__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3556:1: ( ( '=' ) )
+            // InternalGridSource.g:3557:1: ( '=' )
+            {
+            // InternalGridSource.g:3557:1: ( '=' )
+            // InternalGridSource.g:3558:2: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_8()); 
+            }
+            match(input,30,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_8()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__8__Impl"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__9"
+    // InternalGridSource.g:3567:1: rule__PropertyPriceStyle__Group__9 : rule__PropertyPriceStyle__Group__9__Impl ;
+    public final void rule__PropertyPriceStyle__Group__9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3571:1: ( rule__PropertyPriceStyle__Group__9__Impl )
+            // InternalGridSource.g:3572:2: rule__PropertyPriceStyle__Group__9__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__9"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group__9__Impl"
+    // InternalGridSource.g:3578:1: rule__PropertyPriceStyle__Group__9__Impl : ( ( rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9 ) ) ;
+    public final void rule__PropertyPriceStyle__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3582:1: ( ( ( rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9 ) ) )
+            // InternalGridSource.g:3583:1: ( ( rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9 ) )
+            {
+            // InternalGridSource.g:3583:1: ( ( rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9 ) )
+            // InternalGridSource.g:3584:2: ( rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathAssignment_9()); 
+            }
+            // InternalGridSource.g:3585:2: ( rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9 )
+            // InternalGridSource.g:3585:3: rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathAssignment_9()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group__9__Impl"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group_6__0"
+    // InternalGridSource.g:3594:1: rule__PropertyPriceStyle__Group_6__0 : rule__PropertyPriceStyle__Group_6__0__Impl rule__PropertyPriceStyle__Group_6__1 ;
+    public final void rule__PropertyPriceStyle__Group_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3598:1: ( rule__PropertyPriceStyle__Group_6__0__Impl rule__PropertyPriceStyle__Group_6__1 )
+            // InternalGridSource.g:3599:2: rule__PropertyPriceStyle__Group_6__0__Impl rule__PropertyPriceStyle__Group_6__1
+            {
+            pushFollow(FOLLOW_28);
+            rule__PropertyPriceStyle__Group_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group_6__0"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group_6__0__Impl"
+    // InternalGridSource.g:3606:1: rule__PropertyPriceStyle__Group_6__0__Impl : ( '(' ) ;
+    public final void rule__PropertyPriceStyle__Group_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3610:1: ( ( '(' ) )
+            // InternalGridSource.g:3611:1: ( '(' )
+            {
+            // InternalGridSource.g:3611:1: ( '(' )
+            // InternalGridSource.g:3612:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getLeftParenthesisKeyword_6_0()); 
+            }
+            match(input,50,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getLeftParenthesisKeyword_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group_6__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group_6__1"
+    // InternalGridSource.g:3621:1: rule__PropertyPriceStyle__Group_6__1 : rule__PropertyPriceStyle__Group_6__1__Impl rule__PropertyPriceStyle__Group_6__2 ;
+    public final void rule__PropertyPriceStyle__Group_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3625:1: ( rule__PropertyPriceStyle__Group_6__1__Impl rule__PropertyPriceStyle__Group_6__2 )
+            // InternalGridSource.g:3626:2: rule__PropertyPriceStyle__Group_6__1__Impl rule__PropertyPriceStyle__Group_6__2
+            {
+            pushFollow(FOLLOW_24);
+            rule__PropertyPriceStyle__Group_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group_6__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group_6__1"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group_6__1__Impl"
+    // InternalGridSource.g:3633:1: rule__PropertyPriceStyle__Group_6__1__Impl : ( 'format' ) ;
+    public final void rule__PropertyPriceStyle__Group_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3637:1: ( ( 'format' ) )
+            // InternalGridSource.g:3638:1: ( 'format' )
+            {
+            // InternalGridSource.g:3638:1: ( 'format' )
+            // InternalGridSource.g:3639:2: 'format'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getFormatKeyword_6_1()); 
+            }
+            match(input,40,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getFormatKeyword_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group_6__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group_6__2"
+    // InternalGridSource.g:3648:1: rule__PropertyPriceStyle__Group_6__2 : rule__PropertyPriceStyle__Group_6__2__Impl rule__PropertyPriceStyle__Group_6__3 ;
+    public final void rule__PropertyPriceStyle__Group_6__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3652:1: ( rule__PropertyPriceStyle__Group_6__2__Impl rule__PropertyPriceStyle__Group_6__3 )
+            // InternalGridSource.g:3653:2: rule__PropertyPriceStyle__Group_6__2__Impl rule__PropertyPriceStyle__Group_6__3
+            {
+            pushFollow(FOLLOW_38);
+            rule__PropertyPriceStyle__Group_6__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group_6__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group_6__2"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group_6__2__Impl"
+    // InternalGridSource.g:3660:1: rule__PropertyPriceStyle__Group_6__2__Impl : ( ( rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2 ) ) ;
+    public final void rule__PropertyPriceStyle__Group_6__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3664:1: ( ( ( rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2 ) ) )
+            // InternalGridSource.g:3665:1: ( ( rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2 ) )
+            {
+            // InternalGridSource.g:3665:1: ( ( rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2 ) )
+            // InternalGridSource.g:3666:2: ( rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatAssignment_6_2()); 
+            }
+            // InternalGridSource.g:3667:2: ( rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2 )
+            // InternalGridSource.g:3667:3: rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatAssignment_6_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group_6__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group_6__3"
+    // InternalGridSource.g:3675:1: rule__PropertyPriceStyle__Group_6__3 : rule__PropertyPriceStyle__Group_6__3__Impl ;
+    public final void rule__PropertyPriceStyle__Group_6__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3679:1: ( rule__PropertyPriceStyle__Group_6__3__Impl )
+            // InternalGridSource.g:3680:2: rule__PropertyPriceStyle__Group_6__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyPriceStyle__Group_6__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group_6__3"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__Group_6__3__Impl"
+    // InternalGridSource.g:3686:1: rule__PropertyPriceStyle__Group_6__3__Impl : ( ')' ) ;
+    public final void rule__PropertyPriceStyle__Group_6__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3690:1: ( ( ')' ) )
+            // InternalGridSource.g:3691:1: ( ')' )
+            {
+            // InternalGridSource.g:3691:1: ( ')' )
+            // InternalGridSource.g:3692:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getRightParenthesisKeyword_6_3()); 
+            }
+            match(input,51,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getRightParenthesisKeyword_6_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__Group_6__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyTextStyle__Group__0"
+    // InternalGridSource.g:3702:1: rule__PropertyTextStyle__Group__0 : rule__PropertyTextStyle__Group__0__Impl rule__PropertyTextStyle__Group__1 ;
+    public final void rule__PropertyTextStyle__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3706:1: ( rule__PropertyTextStyle__Group__0__Impl rule__PropertyTextStyle__Group__1 )
+            // InternalGridSource.g:3707:2: rule__PropertyTextStyle__Group__0__Impl rule__PropertyTextStyle__Group__1
+            {
+            pushFollow(FOLLOW_41);
+            rule__PropertyTextStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyTextStyle__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyTextStyle__Group__0"
+
+
+    // $ANTLR start "rule__PropertyTextStyle__Group__0__Impl"
+    // InternalGridSource.g:3714:1: rule__PropertyTextStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyTextStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3718:1: ( ( () ) )
+            // InternalGridSource.g:3719:1: ( () )
+            {
+            // InternalGridSource.g:3719:1: ( () )
+            // InternalGridSource.g:3720:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyTextStyleAccess().getCxGridPropTextStyleAction_0()); 
+            }
+            // InternalGridSource.g:3721:2: ()
+            // InternalGridSource.g:3721:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyTextStyleAccess().getCxGridPropTextStyleAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyTextStyle__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyTextStyle__Group__1"
+    // InternalGridSource.g:3729:1: rule__PropertyTextStyle__Group__1 : rule__PropertyTextStyle__Group__1__Impl ;
+    public final void rule__PropertyTextStyle__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3733:1: ( rule__PropertyTextStyle__Group__1__Impl )
+            // InternalGridSource.g:3734:2: rule__PropertyTextStyle__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyTextStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyTextStyle__Group__1"
+
+
+    // $ANTLR start "rule__PropertyTextStyle__Group__1__Impl"
+    // InternalGridSource.g:3740:1: rule__PropertyTextStyle__Group__1__Impl : ( 'textStyle' ) ;
+    public final void rule__PropertyTextStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3744:1: ( ( 'textStyle' ) )
+            // InternalGridSource.g:3745:1: ( 'textStyle' )
+            {
+            // InternalGridSource.g:3745:1: ( 'textStyle' )
+            // InternalGridSource.g:3746:2: 'textStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyTextStyleAccess().getTextStyleKeyword_1()); 
+            }
+            match(input,54,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyTextStyleAccess().getTextStyleKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyTextStyle__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group__0"
+    // InternalGridSource.g:3756:1: rule__PropertyImageStyle__Group__0 : rule__PropertyImageStyle__Group__0__Impl rule__PropertyImageStyle__Group__1 ;
+    public final void rule__PropertyImageStyle__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3760:1: ( rule__PropertyImageStyle__Group__0__Impl rule__PropertyImageStyle__Group__1 )
+            // InternalGridSource.g:3761:2: rule__PropertyImageStyle__Group__0__Impl rule__PropertyImageStyle__Group__1
+            {
+            pushFollow(FOLLOW_42);
+            rule__PropertyImageStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyImageStyle__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group__0"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group__0__Impl"
+    // InternalGridSource.g:3768:1: rule__PropertyImageStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyImageStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3772:1: ( ( () ) )
+            // InternalGridSource.g:3773:1: ( () )
+            {
+            // InternalGridSource.g:3773:1: ( () )
+            // InternalGridSource.g:3774:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyImageStyleAccess().getCxGridPropImageStyleAction_0()); 
+            }
+            // InternalGridSource.g:3775:2: ()
+            // InternalGridSource.g:3775:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyImageStyleAccess().getCxGridPropImageStyleAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group__1"
+    // InternalGridSource.g:3783:1: rule__PropertyImageStyle__Group__1 : rule__PropertyImageStyle__Group__1__Impl rule__PropertyImageStyle__Group__2 ;
+    public final void rule__PropertyImageStyle__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3787:1: ( rule__PropertyImageStyle__Group__1__Impl rule__PropertyImageStyle__Group__2 )
+            // InternalGridSource.g:3788:2: rule__PropertyImageStyle__Group__1__Impl rule__PropertyImageStyle__Group__2
+            {
+            pushFollow(FOLLOW_43);
+            rule__PropertyImageStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyImageStyle__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group__1"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group__1__Impl"
+    // InternalGridSource.g:3795:1: rule__PropertyImageStyle__Group__1__Impl : ( 'imageStyle' ) ;
+    public final void rule__PropertyImageStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3799:1: ( ( 'imageStyle' ) )
+            // InternalGridSource.g:3800:1: ( 'imageStyle' )
+            {
+            // InternalGridSource.g:3800:1: ( 'imageStyle' )
+            // InternalGridSource.g:3801:2: 'imageStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyImageStyleAccess().getImageStyleKeyword_1()); 
+            }
+            match(input,55,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyImageStyleAccess().getImageStyleKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group__1__Impl"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group__2"
+    // InternalGridSource.g:3810:1: rule__PropertyImageStyle__Group__2 : rule__PropertyImageStyle__Group__2__Impl rule__PropertyImageStyle__Group__3 ;
+    public final void rule__PropertyImageStyle__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3814:1: ( rule__PropertyImageStyle__Group__2__Impl rule__PropertyImageStyle__Group__3 )
+            // InternalGridSource.g:3815:2: rule__PropertyImageStyle__Group__2__Impl rule__PropertyImageStyle__Group__3
+            {
+            pushFollow(FOLLOW_43);
+            rule__PropertyImageStyle__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyImageStyle__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group__2"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group__2__Impl"
+    // InternalGridSource.g:3822:1: rule__PropertyImageStyle__Group__2__Impl : ( ( rule__PropertyImageStyle__Group_2__0 )? ) ;
+    public final void rule__PropertyImageStyle__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3826:1: ( ( ( rule__PropertyImageStyle__Group_2__0 )? ) )
+            // InternalGridSource.g:3827:1: ( ( rule__PropertyImageStyle__Group_2__0 )? )
+            {
+            // InternalGridSource.g:3827:1: ( ( rule__PropertyImageStyle__Group_2__0 )? )
+            // InternalGridSource.g:3828:2: ( rule__PropertyImageStyle__Group_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyImageStyleAccess().getGroup_2()); 
+            }
+            // InternalGridSource.g:3829:2: ( rule__PropertyImageStyle__Group_2__0 )?
+            int alt20=2;
+            int LA20_0 = input.LA(1);
+
+            if ( (LA20_0==36) ) {
+                alt20=1;
+            }
+            switch (alt20) {
+                case 1 :
+                    // InternalGridSource.g:3829:3: rule__PropertyImageStyle__Group_2__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__PropertyImageStyle__Group_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyImageStyleAccess().getGroup_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group__2__Impl"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group__3"
+    // InternalGridSource.g:3837:1: rule__PropertyImageStyle__Group__3 : rule__PropertyImageStyle__Group__3__Impl rule__PropertyImageStyle__Group__4 ;
+    public final void rule__PropertyImageStyle__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3841:1: ( rule__PropertyImageStyle__Group__3__Impl rule__PropertyImageStyle__Group__4 )
+            // InternalGridSource.g:3842:2: rule__PropertyImageStyle__Group__3__Impl rule__PropertyImageStyle__Group__4
+            {
+            pushFollow(FOLLOW_44);
+            rule__PropertyImageStyle__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyImageStyle__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group__3"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group__3__Impl"
+    // InternalGridSource.g:3849:1: rule__PropertyImageStyle__Group__3__Impl : ( '{' ) ;
+    public final void rule__PropertyImageStyle__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3853:1: ( ( '{' ) )
+            // InternalGridSource.g:3854:1: ( '{' )
+            {
+            // InternalGridSource.g:3854:1: ( '{' )
+            // InternalGridSource.g:3855:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyImageStyleAccess().getLeftCurlyBracketKeyword_3()); 
+            }
+            match(input,23,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyImageStyleAccess().getLeftCurlyBracketKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group__3__Impl"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group__4"
+    // InternalGridSource.g:3864:1: rule__PropertyImageStyle__Group__4 : rule__PropertyImageStyle__Group__4__Impl rule__PropertyImageStyle__Group__5 ;
+    public final void rule__PropertyImageStyle__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3868:1: ( rule__PropertyImageStyle__Group__4__Impl rule__PropertyImageStyle__Group__5 )
+            // InternalGridSource.g:3869:2: rule__PropertyImageStyle__Group__4__Impl rule__PropertyImageStyle__Group__5
+            {
+            pushFollow(FOLLOW_44);
+            rule__PropertyImageStyle__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyImageStyle__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group__4"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group__4__Impl"
+    // InternalGridSource.g:3876:1: rule__PropertyImageStyle__Group__4__Impl : ( ( rule__PropertyImageStyle__ConfigsAssignment_4 )* ) ;
+    public final void rule__PropertyImageStyle__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3880:1: ( ( ( rule__PropertyImageStyle__ConfigsAssignment_4 )* ) )
+            // InternalGridSource.g:3881:1: ( ( rule__PropertyImageStyle__ConfigsAssignment_4 )* )
+            {
+            // InternalGridSource.g:3881:1: ( ( rule__PropertyImageStyle__ConfigsAssignment_4 )* )
+            // InternalGridSource.g:3882:2: ( rule__PropertyImageStyle__ConfigsAssignment_4 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyImageStyleAccess().getConfigsAssignment_4()); 
+            }
+            // InternalGridSource.g:3883:2: ( rule__PropertyImageStyle__ConfigsAssignment_4 )*
+            loop21:
+            do {
+                int alt21=2;
+                int LA21_0 = input.LA(1);
+
+                if ( (LA21_0==56||LA21_0==58) ) {
+                    alt21=1;
+                }
+
+
+                switch (alt21) {
+            	case 1 :
+            	    // InternalGridSource.g:3883:3: rule__PropertyImageStyle__ConfigsAssignment_4
+            	    {
+            	    pushFollow(FOLLOW_45);
+            	    rule__PropertyImageStyle__ConfigsAssignment_4();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop21;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyImageStyleAccess().getConfigsAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group__4__Impl"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group__5"
+    // InternalGridSource.g:3891:1: rule__PropertyImageStyle__Group__5 : rule__PropertyImageStyle__Group__5__Impl ;
+    public final void rule__PropertyImageStyle__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3895:1: ( rule__PropertyImageStyle__Group__5__Impl )
+            // InternalGridSource.g:3896:2: rule__PropertyImageStyle__Group__5__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyImageStyle__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group__5"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group__5__Impl"
+    // InternalGridSource.g:3902:1: rule__PropertyImageStyle__Group__5__Impl : ( '}' ) ;
+    public final void rule__PropertyImageStyle__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3906:1: ( ( '}' ) )
+            // InternalGridSource.g:3907:1: ( '}' )
+            {
+            // InternalGridSource.g:3907:1: ( '}' )
+            // InternalGridSource.g:3908:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyImageStyleAccess().getRightCurlyBracketKeyword_5()); 
+            }
+            match(input,25,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyImageStyleAccess().getRightCurlyBracketKeyword_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group__5__Impl"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group_2__0"
+    // InternalGridSource.g:3918:1: rule__PropertyImageStyle__Group_2__0 : rule__PropertyImageStyle__Group_2__0__Impl rule__PropertyImageStyle__Group_2__1 ;
+    public final void rule__PropertyImageStyle__Group_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3922:1: ( rule__PropertyImageStyle__Group_2__0__Impl rule__PropertyImageStyle__Group_2__1 )
+            // InternalGridSource.g:3923:2: rule__PropertyImageStyle__Group_2__0__Impl rule__PropertyImageStyle__Group_2__1
+            {
+            pushFollow(FOLLOW_24);
+            rule__PropertyImageStyle__Group_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__PropertyImageStyle__Group_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group_2__0"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group_2__0__Impl"
+    // InternalGridSource.g:3930:1: rule__PropertyImageStyle__Group_2__0__Impl : ( 'eventTopic' ) ;
+    public final void rule__PropertyImageStyle__Group_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3934:1: ( ( 'eventTopic' ) )
+            // InternalGridSource.g:3935:1: ( 'eventTopic' )
+            {
+            // InternalGridSource.g:3935:1: ( 'eventTopic' )
+            // InternalGridSource.g:3936:2: 'eventTopic'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyImageStyleAccess().getEventTopicKeyword_2_0()); 
+            }
+            match(input,36,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyImageStyleAccess().getEventTopicKeyword_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group_2__0__Impl"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group_2__1"
+    // InternalGridSource.g:3945:1: rule__PropertyImageStyle__Group_2__1 : rule__PropertyImageStyle__Group_2__1__Impl ;
+    public final void rule__PropertyImageStyle__Group_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3949:1: ( rule__PropertyImageStyle__Group_2__1__Impl )
+            // InternalGridSource.g:3950:2: rule__PropertyImageStyle__Group_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyImageStyle__Group_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group_2__1"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__Group_2__1__Impl"
+    // InternalGridSource.g:3956:1: rule__PropertyImageStyle__Group_2__1__Impl : ( ( rule__PropertyImageStyle__EventTopicAssignment_2_1 ) ) ;
+    public final void rule__PropertyImageStyle__Group_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3960:1: ( ( ( rule__PropertyImageStyle__EventTopicAssignment_2_1 ) ) )
+            // InternalGridSource.g:3961:1: ( ( rule__PropertyImageStyle__EventTopicAssignment_2_1 ) )
+            {
+            // InternalGridSource.g:3961:1: ( ( rule__PropertyImageStyle__EventTopicAssignment_2_1 ) )
+            // InternalGridSource.g:3962:2: ( rule__PropertyImageStyle__EventTopicAssignment_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyImageStyleAccess().getEventTopicAssignment_2_1()); 
+            }
+            // InternalGridSource.g:3963:2: ( rule__PropertyImageStyle__EventTopicAssignment_2_1 )
+            // InternalGridSource.g:3963:3: rule__PropertyImageStyle__EventTopicAssignment_2_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__PropertyImageStyle__EventTopicAssignment_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyImageStyleAccess().getEventTopicAssignment_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__Group_2__1__Impl"
+
+
+    // $ANTLR start "rule__QualifiedName__Group__0"
+    // InternalGridSource.g:3972:1: rule__QualifiedName__Group__0 : rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1 ;
+    public final void rule__QualifiedName__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3976:1: ( rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1 )
+            // InternalGridSource.g:3977:2: rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1
+            {
+            pushFollow(FOLLOW_21);
+            rule__QualifiedName__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__QualifiedName__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group__0"
+
+
+    // $ANTLR start "rule__QualifiedName__Group__0__Impl"
+    // InternalGridSource.g:3984:1: rule__QualifiedName__Group__0__Impl : ( ruleValidID ) ;
+    public final void rule__QualifiedName__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:3988:1: ( ( ruleValidID ) )
+            // InternalGridSource.g:3989:1: ( ruleValidID )
+            {
+            // InternalGridSource.g:3989:1: ( ruleValidID )
+            // InternalGridSource.g:3990:2: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group__0__Impl"
+
+
+    // $ANTLR start "rule__QualifiedName__Group__1"
+    // InternalGridSource.g:3999:1: rule__QualifiedName__Group__1 : rule__QualifiedName__Group__1__Impl ;
+    public final void rule__QualifiedName__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4003:1: ( rule__QualifiedName__Group__1__Impl )
+            // InternalGridSource.g:4004:2: rule__QualifiedName__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__QualifiedName__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group__1"
+
+
+    // $ANTLR start "rule__QualifiedName__Group__1__Impl"
+    // InternalGridSource.g:4010:1: rule__QualifiedName__Group__1__Impl : ( ( rule__QualifiedName__Group_1__0 )* ) ;
+    public final void rule__QualifiedName__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4014:1: ( ( ( rule__QualifiedName__Group_1__0 )* ) )
+            // InternalGridSource.g:4015:1: ( ( rule__QualifiedName__Group_1__0 )* )
+            {
+            // InternalGridSource.g:4015:1: ( ( rule__QualifiedName__Group_1__0 )* )
+            // InternalGridSource.g:4016:2: ( rule__QualifiedName__Group_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameAccess().getGroup_1()); 
+            }
+            // InternalGridSource.g:4017:2: ( rule__QualifiedName__Group_1__0 )*
+            loop22:
+            do {
+                int alt22=2;
+                int LA22_0 = input.LA(1);
+
+                if ( (LA22_0==34) ) {
+                    int LA22_2 = input.LA(2);
+
+                    if ( (LA22_2==RULE_ID) ) {
+                        alt22=1;
+                    }
+
+
+                }
+
+
+                switch (alt22) {
+            	case 1 :
+            	    // InternalGridSource.g:4017:3: rule__QualifiedName__Group_1__0
+            	    {
+            	    pushFollow(FOLLOW_46);
+            	    rule__QualifiedName__Group_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop22;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group__1__Impl"
+
+
+    // $ANTLR start "rule__QualifiedName__Group_1__0"
+    // InternalGridSource.g:4026:1: rule__QualifiedName__Group_1__0 : rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1 ;
+    public final void rule__QualifiedName__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4030:1: ( rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1 )
+            // InternalGridSource.g:4031:2: rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1
+            {
+            pushFollow(FOLLOW_4);
+            rule__QualifiedName__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__QualifiedName__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group_1__0"
+
+
+    // $ANTLR start "rule__QualifiedName__Group_1__0__Impl"
+    // InternalGridSource.g:4038:1: rule__QualifiedName__Group_1__0__Impl : ( ( '.' ) ) ;
+    public final void rule__QualifiedName__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4042:1: ( ( ( '.' ) ) )
+            // InternalGridSource.g:4043:1: ( ( '.' ) )
+            {
+            // InternalGridSource.g:4043:1: ( ( '.' ) )
+            // InternalGridSource.g:4044:2: ( '.' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); 
+            }
+            // InternalGridSource.g:4045:2: ( '.' )
+            // InternalGridSource.g:4045:3: '.'
+            {
+            match(input,34,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__QualifiedName__Group_1__1"
+    // InternalGridSource.g:4053:1: rule__QualifiedName__Group_1__1 : rule__QualifiedName__Group_1__1__Impl ;
+    public final void rule__QualifiedName__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4057:1: ( rule__QualifiedName__Group_1__1__Impl )
+            // InternalGridSource.g:4058:2: rule__QualifiedName__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__QualifiedName__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group_1__1"
+
+
+    // $ANTLR start "rule__QualifiedName__Group_1__1__Impl"
+    // InternalGridSource.g:4064:1: rule__QualifiedName__Group_1__1__Impl : ( ruleValidID ) ;
+    public final void rule__QualifiedName__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4068:1: ( ( ruleValidID ) )
+            // InternalGridSource.g:4069:1: ( ruleValidID )
+            {
+            // InternalGridSource.g:4069:1: ( ruleValidID )
+            // InternalGridSource.g:4070:2: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedName__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__NumericToResourceStyleConfig__Group__0"
+    // InternalGridSource.g:4080:1: rule__NumericToResourceStyleConfig__Group__0 : rule__NumericToResourceStyleConfig__Group__0__Impl rule__NumericToResourceStyleConfig__Group__1 ;
+    public final void rule__NumericToResourceStyleConfig__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4084:1: ( rule__NumericToResourceStyleConfig__Group__0__Impl rule__NumericToResourceStyleConfig__Group__1 )
+            // InternalGridSource.g:4085:2: rule__NumericToResourceStyleConfig__Group__0__Impl rule__NumericToResourceStyleConfig__Group__1
+            {
+            pushFollow(FOLLOW_47);
+            rule__NumericToResourceStyleConfig__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__NumericToResourceStyleConfig__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NumericToResourceStyleConfig__Group__0"
+
+
+    // $ANTLR start "rule__NumericToResourceStyleConfig__Group__0__Impl"
+    // InternalGridSource.g:4092:1: rule__NumericToResourceStyleConfig__Group__0__Impl : ( 'number' ) ;
+    public final void rule__NumericToResourceStyleConfig__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4096:1: ( ( 'number' ) )
+            // InternalGridSource.g:4097:1: ( 'number' )
+            {
+            // InternalGridSource.g:4097:1: ( 'number' )
+            // InternalGridSource.g:4098:2: 'number'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumericToResourceStyleConfigAccess().getNumberKeyword_0()); 
+            }
+            match(input,56,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumericToResourceStyleConfigAccess().getNumberKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NumericToResourceStyleConfig__Group__0__Impl"
+
+
+    // $ANTLR start "rule__NumericToResourceStyleConfig__Group__1"
+    // InternalGridSource.g:4107:1: rule__NumericToResourceStyleConfig__Group__1 : rule__NumericToResourceStyleConfig__Group__1__Impl rule__NumericToResourceStyleConfig__Group__2 ;
+    public final void rule__NumericToResourceStyleConfig__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4111:1: ( rule__NumericToResourceStyleConfig__Group__1__Impl rule__NumericToResourceStyleConfig__Group__2 )
+            // InternalGridSource.g:4112:2: rule__NumericToResourceStyleConfig__Group__1__Impl rule__NumericToResourceStyleConfig__Group__2
+            {
+            pushFollow(FOLLOW_32);
+            rule__NumericToResourceStyleConfig__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__NumericToResourceStyleConfig__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NumericToResourceStyleConfig__Group__1"
+
+
+    // $ANTLR start "rule__NumericToResourceStyleConfig__Group__1__Impl"
+    // InternalGridSource.g:4119:1: rule__NumericToResourceStyleConfig__Group__1__Impl : ( ( rule__NumericToResourceStyleConfig__CompareAssignment_1 ) ) ;
+    public final void rule__NumericToResourceStyleConfig__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4123:1: ( ( ( rule__NumericToResourceStyleConfig__CompareAssignment_1 ) ) )
+            // InternalGridSource.g:4124:1: ( ( rule__NumericToResourceStyleConfig__CompareAssignment_1 ) )
+            {
+            // InternalGridSource.g:4124:1: ( ( rule__NumericToResourceStyleConfig__CompareAssignment_1 ) )
+            // InternalGridSource.g:4125:2: ( rule__NumericToResourceStyleConfig__CompareAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareAssignment_1()); 
+            }
+            // InternalGridSource.g:4126:2: ( rule__NumericToResourceStyleConfig__CompareAssignment_1 )
+            // InternalGridSource.g:4126:3: rule__NumericToResourceStyleConfig__CompareAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__NumericToResourceStyleConfig__CompareAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NumericToResourceStyleConfig__Group__1__Impl"
+
+
+    // $ANTLR start "rule__NumericToResourceStyleConfig__Group__2"
+    // InternalGridSource.g:4134:1: rule__NumericToResourceStyleConfig__Group__2 : rule__NumericToResourceStyleConfig__Group__2__Impl rule__NumericToResourceStyleConfig__Group__3 ;
+    public final void rule__NumericToResourceStyleConfig__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4138:1: ( rule__NumericToResourceStyleConfig__Group__2__Impl rule__NumericToResourceStyleConfig__Group__3 )
+            // InternalGridSource.g:4139:2: rule__NumericToResourceStyleConfig__Group__2__Impl rule__NumericToResourceStyleConfig__Group__3
+            {
+            pushFollow(FOLLOW_48);
+            rule__NumericToResourceStyleConfig__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__NumericToResourceStyleConfig__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NumericToResourceStyleConfig__Group__2"
+
+
+    // $ANTLR start "rule__NumericToResourceStyleConfig__Group__2__Impl"
+    // InternalGridSource.g:4146:1: rule__NumericToResourceStyleConfig__Group__2__Impl : ( ( rule__NumericToResourceStyleConfig__ValueAssignment_2 ) ) ;
+    public final void rule__NumericToResourceStyleConfig__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4150:1: ( ( ( rule__NumericToResourceStyleConfig__ValueAssignment_2 ) ) )
+            // InternalGridSource.g:4151:1: ( ( rule__NumericToResourceStyleConfig__ValueAssignment_2 ) )
+            {
+            // InternalGridSource.g:4151:1: ( ( rule__NumericToResourceStyleConfig__ValueAssignment_2 ) )
+            // InternalGridSource.g:4152:2: ( rule__NumericToResourceStyleConfig__ValueAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumericToResourceStyleConfigAccess().getValueAssignment_2()); 
+            }
+            // InternalGridSource.g:4153:2: ( rule__NumericToResourceStyleConfig__ValueAssignment_2 )
+            // InternalGridSource.g:4153:3: rule__NumericToResourceStyleConfig__ValueAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__NumericToResourceStyleConfig__ValueAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumericToResourceStyleConfigAccess().getValueAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NumericToResourceStyleConfig__Group__2__Impl"
+
+
+    // $ANTLR start "rule__NumericToResourceStyleConfig__Group__3"
+    // InternalGridSource.g:4161:1: rule__NumericToResourceStyleConfig__Group__3 : rule__NumericToResourceStyleConfig__Group__3__Impl rule__NumericToResourceStyleConfig__Group__4 ;
+    public final void rule__NumericToResourceStyleConfig__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4165:1: ( rule__NumericToResourceStyleConfig__Group__3__Impl rule__NumericToResourceStyleConfig__Group__4 )
+            // InternalGridSource.g:4166:2: rule__NumericToResourceStyleConfig__Group__3__Impl rule__NumericToResourceStyleConfig__Group__4
+            {
+            pushFollow(FOLLOW_49);
+            rule__NumericToResourceStyleConfig__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__NumericToResourceStyleConfig__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NumericToResourceStyleConfig__Group__3"
+
+
+    // $ANTLR start "rule__NumericToResourceStyleConfig__Group__3__Impl"
+    // InternalGridSource.g:4173:1: rule__NumericToResourceStyleConfig__Group__3__Impl : ( 'then' ) ;
+    public final void rule__NumericToResourceStyleConfig__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4177:1: ( ( 'then' ) )
+            // InternalGridSource.g:4178:1: ( 'then' )
+            {
+            // InternalGridSource.g:4178:1: ( 'then' )
+            // InternalGridSource.g:4179:2: 'then'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumericToResourceStyleConfigAccess().getThenKeyword_3()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumericToResourceStyleConfigAccess().getThenKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NumericToResourceStyleConfig__Group__3__Impl"
+
+
+    // $ANTLR start "rule__NumericToResourceStyleConfig__Group__4"
+    // InternalGridSource.g:4188:1: rule__NumericToResourceStyleConfig__Group__4 : rule__NumericToResourceStyleConfig__Group__4__Impl ;
+    public final void rule__NumericToResourceStyleConfig__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4192:1: ( rule__NumericToResourceStyleConfig__Group__4__Impl )
+            // InternalGridSource.g:4193:2: rule__NumericToResourceStyleConfig__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__NumericToResourceStyleConfig__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NumericToResourceStyleConfig__Group__4"
+
+
+    // $ANTLR start "rule__NumericToResourceStyleConfig__Group__4__Impl"
+    // InternalGridSource.g:4199:1: rule__NumericToResourceStyleConfig__Group__4__Impl : ( ( rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4 ) ) ;
+    public final void rule__NumericToResourceStyleConfig__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4203:1: ( ( ( rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4 ) ) )
+            // InternalGridSource.g:4204:1: ( ( rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4 ) )
+            {
+            // InternalGridSource.g:4204:1: ( ( rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4 ) )
+            // InternalGridSource.g:4205:2: ( rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathAssignment_4()); 
+            }
+            // InternalGridSource.g:4206:2: ( rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4 )
+            // InternalGridSource.g:4206:3: rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4
+            {
+            pushFollow(FOLLOW_2);
+            rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NumericToResourceStyleConfig__Group__4__Impl"
+
+
+    // $ANTLR start "rule__StringToResourceStyleConfig__Group__0"
+    // InternalGridSource.g:4215:1: rule__StringToResourceStyleConfig__Group__0 : rule__StringToResourceStyleConfig__Group__0__Impl rule__StringToResourceStyleConfig__Group__1 ;
+    public final void rule__StringToResourceStyleConfig__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4219:1: ( rule__StringToResourceStyleConfig__Group__0__Impl rule__StringToResourceStyleConfig__Group__1 )
+            // InternalGridSource.g:4220:2: rule__StringToResourceStyleConfig__Group__0__Impl rule__StringToResourceStyleConfig__Group__1
+            {
+            pushFollow(FOLLOW_47);
+            rule__StringToResourceStyleConfig__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__StringToResourceStyleConfig__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StringToResourceStyleConfig__Group__0"
+
+
+    // $ANTLR start "rule__StringToResourceStyleConfig__Group__0__Impl"
+    // InternalGridSource.g:4227:1: rule__StringToResourceStyleConfig__Group__0__Impl : ( 'string' ) ;
+    public final void rule__StringToResourceStyleConfig__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4231:1: ( ( 'string' ) )
+            // InternalGridSource.g:4232:1: ( 'string' )
+            {
+            // InternalGridSource.g:4232:1: ( 'string' )
+            // InternalGridSource.g:4233:2: 'string'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStringToResourceStyleConfigAccess().getStringKeyword_0()); 
+            }
+            match(input,58,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStringToResourceStyleConfigAccess().getStringKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StringToResourceStyleConfig__Group__0__Impl"
+
+
+    // $ANTLR start "rule__StringToResourceStyleConfig__Group__1"
+    // InternalGridSource.g:4242:1: rule__StringToResourceStyleConfig__Group__1 : rule__StringToResourceStyleConfig__Group__1__Impl rule__StringToResourceStyleConfig__Group__2 ;
+    public final void rule__StringToResourceStyleConfig__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4246:1: ( rule__StringToResourceStyleConfig__Group__1__Impl rule__StringToResourceStyleConfig__Group__2 )
+            // InternalGridSource.g:4247:2: rule__StringToResourceStyleConfig__Group__1__Impl rule__StringToResourceStyleConfig__Group__2
+            {
+            pushFollow(FOLLOW_24);
+            rule__StringToResourceStyleConfig__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__StringToResourceStyleConfig__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StringToResourceStyleConfig__Group__1"
+
+
+    // $ANTLR start "rule__StringToResourceStyleConfig__Group__1__Impl"
+    // InternalGridSource.g:4254:1: rule__StringToResourceStyleConfig__Group__1__Impl : ( ( rule__StringToResourceStyleConfig__CompareAssignment_1 ) ) ;
+    public final void rule__StringToResourceStyleConfig__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4258:1: ( ( ( rule__StringToResourceStyleConfig__CompareAssignment_1 ) ) )
+            // InternalGridSource.g:4259:1: ( ( rule__StringToResourceStyleConfig__CompareAssignment_1 ) )
+            {
+            // InternalGridSource.g:4259:1: ( ( rule__StringToResourceStyleConfig__CompareAssignment_1 ) )
+            // InternalGridSource.g:4260:2: ( rule__StringToResourceStyleConfig__CompareAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStringToResourceStyleConfigAccess().getCompareAssignment_1()); 
+            }
+            // InternalGridSource.g:4261:2: ( rule__StringToResourceStyleConfig__CompareAssignment_1 )
+            // InternalGridSource.g:4261:3: rule__StringToResourceStyleConfig__CompareAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__StringToResourceStyleConfig__CompareAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStringToResourceStyleConfigAccess().getCompareAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StringToResourceStyleConfig__Group__1__Impl"
+
+
+    // $ANTLR start "rule__StringToResourceStyleConfig__Group__2"
+    // InternalGridSource.g:4269:1: rule__StringToResourceStyleConfig__Group__2 : rule__StringToResourceStyleConfig__Group__2__Impl rule__StringToResourceStyleConfig__Group__3 ;
+    public final void rule__StringToResourceStyleConfig__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4273:1: ( rule__StringToResourceStyleConfig__Group__2__Impl rule__StringToResourceStyleConfig__Group__3 )
+            // InternalGridSource.g:4274:2: rule__StringToResourceStyleConfig__Group__2__Impl rule__StringToResourceStyleConfig__Group__3
+            {
+            pushFollow(FOLLOW_48);
+            rule__StringToResourceStyleConfig__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__StringToResourceStyleConfig__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StringToResourceStyleConfig__Group__2"
+
+
+    // $ANTLR start "rule__StringToResourceStyleConfig__Group__2__Impl"
+    // InternalGridSource.g:4281:1: rule__StringToResourceStyleConfig__Group__2__Impl : ( ( rule__StringToResourceStyleConfig__ValueAssignment_2 ) ) ;
+    public final void rule__StringToResourceStyleConfig__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4285:1: ( ( ( rule__StringToResourceStyleConfig__ValueAssignment_2 ) ) )
+            // InternalGridSource.g:4286:1: ( ( rule__StringToResourceStyleConfig__ValueAssignment_2 ) )
+            {
+            // InternalGridSource.g:4286:1: ( ( rule__StringToResourceStyleConfig__ValueAssignment_2 ) )
+            // InternalGridSource.g:4287:2: ( rule__StringToResourceStyleConfig__ValueAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStringToResourceStyleConfigAccess().getValueAssignment_2()); 
+            }
+            // InternalGridSource.g:4288:2: ( rule__StringToResourceStyleConfig__ValueAssignment_2 )
+            // InternalGridSource.g:4288:3: rule__StringToResourceStyleConfig__ValueAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__StringToResourceStyleConfig__ValueAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStringToResourceStyleConfigAccess().getValueAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StringToResourceStyleConfig__Group__2__Impl"
+
+
+    // $ANTLR start "rule__StringToResourceStyleConfig__Group__3"
+    // InternalGridSource.g:4296:1: rule__StringToResourceStyleConfig__Group__3 : rule__StringToResourceStyleConfig__Group__3__Impl rule__StringToResourceStyleConfig__Group__4 ;
+    public final void rule__StringToResourceStyleConfig__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4300:1: ( rule__StringToResourceStyleConfig__Group__3__Impl rule__StringToResourceStyleConfig__Group__4 )
+            // InternalGridSource.g:4301:2: rule__StringToResourceStyleConfig__Group__3__Impl rule__StringToResourceStyleConfig__Group__4
+            {
+            pushFollow(FOLLOW_49);
+            rule__StringToResourceStyleConfig__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__StringToResourceStyleConfig__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StringToResourceStyleConfig__Group__3"
+
+
+    // $ANTLR start "rule__StringToResourceStyleConfig__Group__3__Impl"
+    // InternalGridSource.g:4308:1: rule__StringToResourceStyleConfig__Group__3__Impl : ( 'then' ) ;
+    public final void rule__StringToResourceStyleConfig__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4312:1: ( ( 'then' ) )
+            // InternalGridSource.g:4313:1: ( 'then' )
+            {
+            // InternalGridSource.g:4313:1: ( 'then' )
+            // InternalGridSource.g:4314:2: 'then'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStringToResourceStyleConfigAccess().getThenKeyword_3()); 
+            }
+            match(input,57,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStringToResourceStyleConfigAccess().getThenKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StringToResourceStyleConfig__Group__3__Impl"
+
+
+    // $ANTLR start "rule__StringToResourceStyleConfig__Group__4"
+    // InternalGridSource.g:4323:1: rule__StringToResourceStyleConfig__Group__4 : rule__StringToResourceStyleConfig__Group__4__Impl ;
+    public final void rule__StringToResourceStyleConfig__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4327:1: ( rule__StringToResourceStyleConfig__Group__4__Impl )
+            // InternalGridSource.g:4328:2: rule__StringToResourceStyleConfig__Group__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__StringToResourceStyleConfig__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StringToResourceStyleConfig__Group__4"
+
+
+    // $ANTLR start "rule__StringToResourceStyleConfig__Group__4__Impl"
+    // InternalGridSource.g:4334:1: rule__StringToResourceStyleConfig__Group__4__Impl : ( ( rule__StringToResourceStyleConfig__ResourceThemePathAssignment_4 ) ) ;
+    public final void rule__StringToResourceStyleConfig__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4338:1: ( ( ( rule__StringToResourceStyleConfig__ResourceThemePathAssignment_4 ) ) )
+            // InternalGridSource.g:4339:1: ( ( rule__StringToResourceStyleConfig__ResourceThemePathAssignment_4 ) )
+            {
+            // InternalGridSource.g:4339:1: ( ( rule__StringToResourceStyleConfig__ResourceThemePathAssignment_4 ) )
+            // InternalGridSource.g:4340:2: ( rule__StringToResourceStyleConfig__ResourceThemePathAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathAssignment_4()); 
+            }
+            // InternalGridSource.g:4341:2: ( rule__StringToResourceStyleConfig__ResourceThemePathAssignment_4 )
+            // InternalGridSource.g:4341:3: rule__StringToResourceStyleConfig__ResourceThemePathAssignment_4
+            {
+            pushFollow(FOLLOW_2);
+            rule__StringToResourceStyleConfig__ResourceThemePathAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StringToResourceStyleConfig__Group__4__Impl"
+
+
+    // $ANTLR start "rule__LInt__Group__0"
+    // InternalGridSource.g:4350:1: rule__LInt__Group__0 : rule__LInt__Group__0__Impl rule__LInt__Group__1 ;
+    public final void rule__LInt__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4354:1: ( rule__LInt__Group__0__Impl rule__LInt__Group__1 )
+            // InternalGridSource.g:4355:2: rule__LInt__Group__0__Impl rule__LInt__Group__1
+            {
+            pushFollow(FOLLOW_32);
+            rule__LInt__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__LInt__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LInt__Group__0"
+
+
+    // $ANTLR start "rule__LInt__Group__0__Impl"
+    // InternalGridSource.g:4362:1: rule__LInt__Group__0__Impl : ( ( rule__LInt__Alternatives_0 )? ) ;
+    public final void rule__LInt__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4366:1: ( ( ( rule__LInt__Alternatives_0 )? ) )
+            // InternalGridSource.g:4367:1: ( ( rule__LInt__Alternatives_0 )? )
+            {
+            // InternalGridSource.g:4367:1: ( ( rule__LInt__Alternatives_0 )? )
+            // InternalGridSource.g:4368:2: ( rule__LInt__Alternatives_0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLIntAccess().getAlternatives_0()); 
+            }
+            // InternalGridSource.g:4369:2: ( rule__LInt__Alternatives_0 )?
+            int alt23=2;
+            int LA23_0 = input.LA(1);
+
+            if ( ((LA23_0>=13 && LA23_0<=14)) ) {
+                alt23=1;
+            }
+            switch (alt23) {
+                case 1 :
+                    // InternalGridSource.g:4369:3: rule__LInt__Alternatives_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__LInt__Alternatives_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLIntAccess().getAlternatives_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LInt__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LInt__Group__1"
+    // InternalGridSource.g:4377:1: rule__LInt__Group__1 : rule__LInt__Group__1__Impl ;
+    public final void rule__LInt__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4381:1: ( rule__LInt__Group__1__Impl )
+            // InternalGridSource.g:4382:2: rule__LInt__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__LInt__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LInt__Group__1"
+
+
+    // $ANTLR start "rule__LInt__Group__1__Impl"
+    // InternalGridSource.g:4388:1: rule__LInt__Group__1__Impl : ( RULE_INT ) ;
+    public final void rule__LInt__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4392:1: ( ( RULE_INT ) )
+            // InternalGridSource.g:4393:1: ( RULE_INT )
+            {
+            // InternalGridSource.g:4393:1: ( RULE_INT )
+            // InternalGridSource.g:4394:2: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLIntAccess().getINTTerminalRuleCall_1()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLIntAccess().getINTTerminalRuleCall_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LInt__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LDouble__Group__0"
+    // InternalGridSource.g:4404:1: rule__LDouble__Group__0 : rule__LDouble__Group__0__Impl rule__LDouble__Group__1 ;
+    public final void rule__LDouble__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4408:1: ( rule__LDouble__Group__0__Impl rule__LDouble__Group__1 )
+            // InternalGridSource.g:4409:2: rule__LDouble__Group__0__Impl rule__LDouble__Group__1
+            {
+            pushFollow(FOLLOW_21);
+            rule__LDouble__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__LDouble__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LDouble__Group__0"
+
+
+    // $ANTLR start "rule__LDouble__Group__0__Impl"
+    // InternalGridSource.g:4416:1: rule__LDouble__Group__0__Impl : ( ruleLInt ) ;
+    public final void rule__LDouble__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4420:1: ( ( ruleLInt ) )
+            // InternalGridSource.g:4421:1: ( ruleLInt )
+            {
+            // InternalGridSource.g:4421:1: ( ruleLInt )
+            // InternalGridSource.g:4422:2: ruleLInt
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLDoubleAccess().getLIntParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleLInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLDoubleAccess().getLIntParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LDouble__Group__0__Impl"
+
+
+    // $ANTLR start "rule__LDouble__Group__1"
+    // InternalGridSource.g:4431:1: rule__LDouble__Group__1 : rule__LDouble__Group__1__Impl ;
+    public final void rule__LDouble__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4435:1: ( rule__LDouble__Group__1__Impl )
+            // InternalGridSource.g:4436:2: rule__LDouble__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__LDouble__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LDouble__Group__1"
+
+
+    // $ANTLR start "rule__LDouble__Group__1__Impl"
+    // InternalGridSource.g:4442:1: rule__LDouble__Group__1__Impl : ( ( rule__LDouble__Group_1__0 )? ) ;
+    public final void rule__LDouble__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4446:1: ( ( ( rule__LDouble__Group_1__0 )? ) )
+            // InternalGridSource.g:4447:1: ( ( rule__LDouble__Group_1__0 )? )
+            {
+            // InternalGridSource.g:4447:1: ( ( rule__LDouble__Group_1__0 )? )
+            // InternalGridSource.g:4448:2: ( rule__LDouble__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLDoubleAccess().getGroup_1()); 
+            }
+            // InternalGridSource.g:4449:2: ( rule__LDouble__Group_1__0 )?
+            int alt24=2;
+            int LA24_0 = input.LA(1);
+
+            if ( (LA24_0==34) ) {
+                alt24=1;
+            }
+            switch (alt24) {
+                case 1 :
+                    // InternalGridSource.g:4449:3: rule__LDouble__Group_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__LDouble__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLDoubleAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LDouble__Group__1__Impl"
+
+
+    // $ANTLR start "rule__LDouble__Group_1__0"
+    // InternalGridSource.g:4458:1: rule__LDouble__Group_1__0 : rule__LDouble__Group_1__0__Impl rule__LDouble__Group_1__1 ;
+    public final void rule__LDouble__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4462:1: ( rule__LDouble__Group_1__0__Impl rule__LDouble__Group_1__1 )
+            // InternalGridSource.g:4463:2: rule__LDouble__Group_1__0__Impl rule__LDouble__Group_1__1
+            {
+            pushFollow(FOLLOW_50);
+            rule__LDouble__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__LDouble__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LDouble__Group_1__0"
+
+
+    // $ANTLR start "rule__LDouble__Group_1__0__Impl"
+    // InternalGridSource.g:4470:1: rule__LDouble__Group_1__0__Impl : ( '.' ) ;
+    public final void rule__LDouble__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4474:1: ( ( '.' ) )
+            // InternalGridSource.g:4475:1: ( '.' )
+            {
+            // InternalGridSource.g:4475:1: ( '.' )
+            // InternalGridSource.g:4476:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLDoubleAccess().getFullStopKeyword_1_0()); 
+            }
+            match(input,34,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLDoubleAccess().getFullStopKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LDouble__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__LDouble__Group_1__1"
+    // InternalGridSource.g:4485:1: rule__LDouble__Group_1__1 : rule__LDouble__Group_1__1__Impl ;
+    public final void rule__LDouble__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4489:1: ( rule__LDouble__Group_1__1__Impl )
+            // InternalGridSource.g:4490:2: rule__LDouble__Group_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__LDouble__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LDouble__Group_1__1"
+
+
+    // $ANTLR start "rule__LDouble__Group_1__1__Impl"
+    // InternalGridSource.g:4496:1: rule__LDouble__Group_1__1__Impl : ( RULE_INT ) ;
+    public final void rule__LDouble__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4500:1: ( ( RULE_INT ) )
+            // InternalGridSource.g:4501:1: ( RULE_INT )
+            {
+            // InternalGridSource.g:4501:1: ( RULE_INT )
+            // InternalGridSource.g:4502:2: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLDoubleAccess().getINTTerminalRuleCall_1_1()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLDoubleAccess().getINTTerminalRuleCall_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__LDouble__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0__0"
+    // InternalGridSource.g:4512:1: rule__JvmTypeReference__Group_0__0 : rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1 ;
+    public final void rule__JvmTypeReference__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4516:1: ( rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1 )
+            // InternalGridSource.g:4517:2: rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1
+            {
+            pushFollow(FOLLOW_51);
+            rule__JvmTypeReference__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmTypeReference__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0__0"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0__0__Impl"
+    // InternalGridSource.g:4524:1: rule__JvmTypeReference__Group_0__0__Impl : ( ruleJvmParameterizedTypeReference ) ;
+    public final void rule__JvmTypeReference__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4528:1: ( ( ruleJvmParameterizedTypeReference ) )
+            // InternalGridSource.g:4529:1: ( ruleJvmParameterizedTypeReference )
+            {
+            // InternalGridSource.g:4529:1: ( ruleJvmParameterizedTypeReference )
+            // InternalGridSource.g:4530:2: ruleJvmParameterizedTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmParameterizedTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0__1"
+    // InternalGridSource.g:4539:1: rule__JvmTypeReference__Group_0__1 : rule__JvmTypeReference__Group_0__1__Impl ;
+    public final void rule__JvmTypeReference__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4543:1: ( rule__JvmTypeReference__Group_0__1__Impl )
+            // InternalGridSource.g:4544:2: rule__JvmTypeReference__Group_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmTypeReference__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0__1"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0__1__Impl"
+    // InternalGridSource.g:4550:1: rule__JvmTypeReference__Group_0__1__Impl : ( ( rule__JvmTypeReference__Group_0_1__0 )* ) ;
+    public final void rule__JvmTypeReference__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4554:1: ( ( ( rule__JvmTypeReference__Group_0_1__0 )* ) )
+            // InternalGridSource.g:4555:1: ( ( rule__JvmTypeReference__Group_0_1__0 )* )
+            {
+            // InternalGridSource.g:4555:1: ( ( rule__JvmTypeReference__Group_0_1__0 )* )
+            // InternalGridSource.g:4556:2: ( rule__JvmTypeReference__Group_0_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1()); 
+            }
+            // InternalGridSource.g:4557:2: ( rule__JvmTypeReference__Group_0_1__0 )*
+            loop25:
+            do {
+                int alt25=2;
+                int LA25_0 = input.LA(1);
+
+                if ( (LA25_0==59) ) {
+                    alt25=1;
+                }
+
+
+                switch (alt25) {
+            	case 1 :
+            	    // InternalGridSource.g:4557:3: rule__JvmTypeReference__Group_0_1__0
+            	    {
+            	    pushFollow(FOLLOW_52);
+            	    rule__JvmTypeReference__Group_0_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop25;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0_1__0"
+    // InternalGridSource.g:4566:1: rule__JvmTypeReference__Group_0_1__0 : rule__JvmTypeReference__Group_0_1__0__Impl ;
+    public final void rule__JvmTypeReference__Group_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4570:1: ( rule__JvmTypeReference__Group_0_1__0__Impl )
+            // InternalGridSource.g:4571:2: rule__JvmTypeReference__Group_0_1__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmTypeReference__Group_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0_1__0"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0_1__0__Impl"
+    // InternalGridSource.g:4577:1: rule__JvmTypeReference__Group_0_1__0__Impl : ( ( rule__JvmTypeReference__Group_0_1_0__0 ) ) ;
+    public final void rule__JvmTypeReference__Group_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4581:1: ( ( ( rule__JvmTypeReference__Group_0_1_0__0 ) ) )
+            // InternalGridSource.g:4582:1: ( ( rule__JvmTypeReference__Group_0_1_0__0 ) )
+            {
+            // InternalGridSource.g:4582:1: ( ( rule__JvmTypeReference__Group_0_1_0__0 ) )
+            // InternalGridSource.g:4583:2: ( rule__JvmTypeReference__Group_0_1_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1_0()); 
+            }
+            // InternalGridSource.g:4584:2: ( rule__JvmTypeReference__Group_0_1_0__0 )
+            // InternalGridSource.g:4584:3: rule__JvmTypeReference__Group_0_1_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmTypeReference__Group_0_1_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__0"
+    // InternalGridSource.g:4593:1: rule__JvmTypeReference__Group_0_1_0__0 : rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1 ;
+    public final void rule__JvmTypeReference__Group_0_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4597:1: ( rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1 )
+            // InternalGridSource.g:4598:2: rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1
+            {
+            pushFollow(FOLLOW_51);
+            rule__JvmTypeReference__Group_0_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmTypeReference__Group_0_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0_1_0__0"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__0__Impl"
+    // InternalGridSource.g:4605:1: rule__JvmTypeReference__Group_0_1_0__0__Impl : ( () ) ;
+    public final void rule__JvmTypeReference__Group_0_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4609:1: ( ( () ) )
+            // InternalGridSource.g:4610:1: ( () )
+            {
+            // InternalGridSource.g:4610:1: ( () )
+            // InternalGridSource.g:4611:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()); 
+            }
+            // InternalGridSource.g:4612:2: ()
+            // InternalGridSource.g:4612:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__1"
+    // InternalGridSource.g:4620:1: rule__JvmTypeReference__Group_0_1_0__1 : rule__JvmTypeReference__Group_0_1_0__1__Impl ;
+    public final void rule__JvmTypeReference__Group_0_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4624:1: ( rule__JvmTypeReference__Group_0_1_0__1__Impl )
+            // InternalGridSource.g:4625:2: rule__JvmTypeReference__Group_0_1_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmTypeReference__Group_0_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0_1_0__1"
+
+
+    // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__1__Impl"
+    // InternalGridSource.g:4631:1: rule__JvmTypeReference__Group_0_1_0__1__Impl : ( ruleArrayBrackets ) ;
+    public final void rule__JvmTypeReference__Group_0_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4635:1: ( ( ruleArrayBrackets ) )
+            // InternalGridSource.g:4636:1: ( ruleArrayBrackets )
+            {
+            // InternalGridSource.g:4636:1: ( ruleArrayBrackets )
+            // InternalGridSource.g:4637:2: ruleArrayBrackets
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleArrayBrackets();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmTypeReference__Group_0_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__ArrayBrackets__Group__0"
+    // InternalGridSource.g:4647:1: rule__ArrayBrackets__Group__0 : rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1 ;
+    public final void rule__ArrayBrackets__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4651:1: ( rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1 )
+            // InternalGridSource.g:4652:2: rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1
+            {
+            pushFollow(FOLLOW_53);
+            rule__ArrayBrackets__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__ArrayBrackets__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArrayBrackets__Group__0"
+
+
+    // $ANTLR start "rule__ArrayBrackets__Group__0__Impl"
+    // InternalGridSource.g:4659:1: rule__ArrayBrackets__Group__0__Impl : ( '[' ) ;
+    public final void rule__ArrayBrackets__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4663:1: ( ( '[' ) )
+            // InternalGridSource.g:4664:1: ( '[' )
+            {
+            // InternalGridSource.g:4664:1: ( '[' )
+            // InternalGridSource.g:4665:2: '['
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0()); 
+            }
+            match(input,59,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArrayBrackets__Group__0__Impl"
+
+
+    // $ANTLR start "rule__ArrayBrackets__Group__1"
+    // InternalGridSource.g:4674:1: rule__ArrayBrackets__Group__1 : rule__ArrayBrackets__Group__1__Impl ;
+    public final void rule__ArrayBrackets__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4678:1: ( rule__ArrayBrackets__Group__1__Impl )
+            // InternalGridSource.g:4679:2: rule__ArrayBrackets__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__ArrayBrackets__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArrayBrackets__Group__1"
+
+
+    // $ANTLR start "rule__ArrayBrackets__Group__1__Impl"
+    // InternalGridSource.g:4685:1: rule__ArrayBrackets__Group__1__Impl : ( ']' ) ;
+    public final void rule__ArrayBrackets__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4689:1: ( ( ']' ) )
+            // InternalGridSource.g:4690:1: ( ']' )
+            {
+            // InternalGridSource.g:4690:1: ( ']' )
+            // InternalGridSource.g:4691:2: ']'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1()); 
+            }
+            match(input,60,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__ArrayBrackets__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group__0"
+    // InternalGridSource.g:4701:1: rule__XFunctionTypeRef__Group__0 : rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1 ;
+    public final void rule__XFunctionTypeRef__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4705:1: ( rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1 )
+            // InternalGridSource.g:4706:2: rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1
+            {
+            pushFollow(FOLLOW_6);
+            rule__XFunctionTypeRef__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group__0"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group__0__Impl"
+    // InternalGridSource.g:4713:1: rule__XFunctionTypeRef__Group__0__Impl : ( ( rule__XFunctionTypeRef__Group_0__0 )? ) ;
+    public final void rule__XFunctionTypeRef__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4717:1: ( ( ( rule__XFunctionTypeRef__Group_0__0 )? ) )
+            // InternalGridSource.g:4718:1: ( ( rule__XFunctionTypeRef__Group_0__0 )? )
+            {
+            // InternalGridSource.g:4718:1: ( ( rule__XFunctionTypeRef__Group_0__0 )? )
+            // InternalGridSource.g:4719:2: ( rule__XFunctionTypeRef__Group_0__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0()); 
+            }
+            // InternalGridSource.g:4720:2: ( rule__XFunctionTypeRef__Group_0__0 )?
+            int alt26=2;
+            int LA26_0 = input.LA(1);
+
+            if ( (LA26_0==50) ) {
+                alt26=1;
+            }
+            switch (alt26) {
+                case 1 :
+                    // InternalGridSource.g:4720:3: rule__XFunctionTypeRef__Group_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XFunctionTypeRef__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getGroup_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group__1"
+    // InternalGridSource.g:4728:1: rule__XFunctionTypeRef__Group__1 : rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2 ;
+    public final void rule__XFunctionTypeRef__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4732:1: ( rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2 )
+            // InternalGridSource.g:4733:2: rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2
+            {
+            pushFollow(FOLLOW_6);
+            rule__XFunctionTypeRef__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group__1"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group__1__Impl"
+    // InternalGridSource.g:4740:1: rule__XFunctionTypeRef__Group__1__Impl : ( '=>' ) ;
+    public final void rule__XFunctionTypeRef__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4744:1: ( ( '=>' ) )
+            // InternalGridSource.g:4745:1: ( '=>' )
+            {
+            // InternalGridSource.g:4745:1: ( '=>' )
+            // InternalGridSource.g:4746:2: '=>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1()); 
+            }
+            match(input,61,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group__2"
+    // InternalGridSource.g:4755:1: rule__XFunctionTypeRef__Group__2 : rule__XFunctionTypeRef__Group__2__Impl ;
+    public final void rule__XFunctionTypeRef__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4759:1: ( rule__XFunctionTypeRef__Group__2__Impl )
+            // InternalGridSource.g:4760:2: rule__XFunctionTypeRef__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group__2"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group__2__Impl"
+    // InternalGridSource.g:4766:1: rule__XFunctionTypeRef__Group__2__Impl : ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) ) ;
+    public final void rule__XFunctionTypeRef__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4770:1: ( ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) ) )
+            // InternalGridSource.g:4771:1: ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) )
+            {
+            // InternalGridSource.g:4771:1: ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) )
+            // InternalGridSource.g:4772:2: ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeAssignment_2()); 
+            }
+            // InternalGridSource.g:4773:2: ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 )
+            // InternalGridSource.g:4773:3: rule__XFunctionTypeRef__ReturnTypeAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__ReturnTypeAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0__0"
+    // InternalGridSource.g:4782:1: rule__XFunctionTypeRef__Group_0__0 : rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1 ;
+    public final void rule__XFunctionTypeRef__Group_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4786:1: ( rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1 )
+            // InternalGridSource.g:4787:2: rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1
+            {
+            pushFollow(FOLLOW_54);
+            rule__XFunctionTypeRef__Group_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0__0"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0__0__Impl"
+    // InternalGridSource.g:4794:1: rule__XFunctionTypeRef__Group_0__0__Impl : ( '(' ) ;
+    public final void rule__XFunctionTypeRef__Group_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4798:1: ( ( '(' ) )
+            // InternalGridSource.g:4799:1: ( '(' )
+            {
+            // InternalGridSource.g:4799:1: ( '(' )
+            // InternalGridSource.g:4800:2: '('
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0()); 
+            }
+            match(input,50,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0__0__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0__1"
+    // InternalGridSource.g:4809:1: rule__XFunctionTypeRef__Group_0__1 : rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2 ;
+    public final void rule__XFunctionTypeRef__Group_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4813:1: ( rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2 )
+            // InternalGridSource.g:4814:2: rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2
+            {
+            pushFollow(FOLLOW_54);
+            rule__XFunctionTypeRef__Group_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0__1"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0__1__Impl"
+    // InternalGridSource.g:4821:1: rule__XFunctionTypeRef__Group_0__1__Impl : ( ( rule__XFunctionTypeRef__Group_0_1__0 )? ) ;
+    public final void rule__XFunctionTypeRef__Group_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4825:1: ( ( ( rule__XFunctionTypeRef__Group_0_1__0 )? ) )
+            // InternalGridSource.g:4826:1: ( ( rule__XFunctionTypeRef__Group_0_1__0 )? )
+            {
+            // InternalGridSource.g:4826:1: ( ( rule__XFunctionTypeRef__Group_0_1__0 )? )
+            // InternalGridSource.g:4827:2: ( rule__XFunctionTypeRef__Group_0_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1()); 
+            }
+            // InternalGridSource.g:4828:2: ( rule__XFunctionTypeRef__Group_0_1__0 )?
+            int alt27=2;
+            int LA27_0 = input.LA(1);
+
+            if ( (LA27_0==RULE_ID||LA27_0==50||LA27_0==61) ) {
+                alt27=1;
+            }
+            switch (alt27) {
+                case 1 :
+                    // InternalGridSource.g:4828:3: rule__XFunctionTypeRef__Group_0_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XFunctionTypeRef__Group_0_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0__1__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0__2"
+    // InternalGridSource.g:4836:1: rule__XFunctionTypeRef__Group_0__2 : rule__XFunctionTypeRef__Group_0__2__Impl ;
+    public final void rule__XFunctionTypeRef__Group_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4840:1: ( rule__XFunctionTypeRef__Group_0__2__Impl )
+            // InternalGridSource.g:4841:2: rule__XFunctionTypeRef__Group_0__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0__2"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0__2__Impl"
+    // InternalGridSource.g:4847:1: rule__XFunctionTypeRef__Group_0__2__Impl : ( ')' ) ;
+    public final void rule__XFunctionTypeRef__Group_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4851:1: ( ( ')' ) )
+            // InternalGridSource.g:4852:1: ( ')' )
+            {
+            // InternalGridSource.g:4852:1: ( ')' )
+            // InternalGridSource.g:4853:2: ')'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2()); 
+            }
+            match(input,51,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0__2__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__0"
+    // InternalGridSource.g:4863:1: rule__XFunctionTypeRef__Group_0_1__0 : rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1 ;
+    public final void rule__XFunctionTypeRef__Group_0_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4867:1: ( rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1 )
+            // InternalGridSource.g:4868:2: rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1
+            {
+            pushFollow(FOLLOW_55);
+            rule__XFunctionTypeRef__Group_0_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group_0_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1__0"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__0__Impl"
+    // InternalGridSource.g:4875:1: rule__XFunctionTypeRef__Group_0_1__0__Impl : ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) ) ;
+    public final void rule__XFunctionTypeRef__Group_0_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4879:1: ( ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) ) )
+            // InternalGridSource.g:4880:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) )
+            {
+            // InternalGridSource.g:4880:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) )
+            // InternalGridSource.g:4881:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_0()); 
+            }
+            // InternalGridSource.g:4882:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 )
+            // InternalGridSource.g:4882:3: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1__0__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__1"
+    // InternalGridSource.g:4890:1: rule__XFunctionTypeRef__Group_0_1__1 : rule__XFunctionTypeRef__Group_0_1__1__Impl ;
+    public final void rule__XFunctionTypeRef__Group_0_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4894:1: ( rule__XFunctionTypeRef__Group_0_1__1__Impl )
+            // InternalGridSource.g:4895:2: rule__XFunctionTypeRef__Group_0_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group_0_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1__1"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__1__Impl"
+    // InternalGridSource.g:4901:1: rule__XFunctionTypeRef__Group_0_1__1__Impl : ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* ) ;
+    public final void rule__XFunctionTypeRef__Group_0_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4905:1: ( ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* ) )
+            // InternalGridSource.g:4906:1: ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* )
+            {
+            // InternalGridSource.g:4906:1: ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* )
+            // InternalGridSource.g:4907:2: ( rule__XFunctionTypeRef__Group_0_1_1__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1_1()); 
+            }
+            // InternalGridSource.g:4908:2: ( rule__XFunctionTypeRef__Group_0_1_1__0 )*
+            loop28:
+            do {
+                int alt28=2;
+                int LA28_0 = input.LA(1);
+
+                if ( (LA28_0==62) ) {
+                    alt28=1;
+                }
+
+
+                switch (alt28) {
+            	case 1 :
+            	    // InternalGridSource.g:4908:3: rule__XFunctionTypeRef__Group_0_1_1__0
+            	    {
+            	    pushFollow(FOLLOW_56);
+            	    rule__XFunctionTypeRef__Group_0_1_1__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop28;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1__1__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__0"
+    // InternalGridSource.g:4917:1: rule__XFunctionTypeRef__Group_0_1_1__0 : rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1 ;
+    public final void rule__XFunctionTypeRef__Group_0_1_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4921:1: ( rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1 )
+            // InternalGridSource.g:4922:2: rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1
+            {
+            pushFollow(FOLLOW_6);
+            rule__XFunctionTypeRef__Group_0_1_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group_0_1_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1_1__0"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__0__Impl"
+    // InternalGridSource.g:4929:1: rule__XFunctionTypeRef__Group_0_1_1__0__Impl : ( ',' ) ;
+    public final void rule__XFunctionTypeRef__Group_0_1_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4933:1: ( ( ',' ) )
+            // InternalGridSource.g:4934:1: ( ',' )
+            {
+            // InternalGridSource.g:4934:1: ( ',' )
+            // InternalGridSource.g:4935:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0()); 
+            }
+            match(input,62,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1_1__0__Impl"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__1"
+    // InternalGridSource.g:4944:1: rule__XFunctionTypeRef__Group_0_1_1__1 : rule__XFunctionTypeRef__Group_0_1_1__1__Impl ;
+    public final void rule__XFunctionTypeRef__Group_0_1_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4948:1: ( rule__XFunctionTypeRef__Group_0_1_1__1__Impl )
+            // InternalGridSource.g:4949:2: rule__XFunctionTypeRef__Group_0_1_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__Group_0_1_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1_1__1"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__1__Impl"
+    // InternalGridSource.g:4955:1: rule__XFunctionTypeRef__Group_0_1_1__1__Impl : ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) ) ;
+    public final void rule__XFunctionTypeRef__Group_0_1_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4959:1: ( ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) ) )
+            // InternalGridSource.g:4960:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) )
+            {
+            // InternalGridSource.g:4960:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) )
+            // InternalGridSource.g:4961:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_1_1()); 
+            }
+            // InternalGridSource.g:4962:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 )
+            // InternalGridSource.g:4962:3: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__Group_0_1_1__1__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group__0"
+    // InternalGridSource.g:4971:1: rule__JvmParameterizedTypeReference__Group__0 : rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1 ;
+    public final void rule__JvmParameterizedTypeReference__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4975:1: ( rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1 )
+            // InternalGridSource.g:4976:2: rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1
+            {
+            pushFollow(FOLLOW_57);
+            rule__JvmParameterizedTypeReference__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group__0__Impl"
+    // InternalGridSource.g:4983:1: rule__JvmParameterizedTypeReference__Group__0__Impl : ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:4987:1: ( ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) ) )
+            // InternalGridSource.g:4988:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) )
+            {
+            // InternalGridSource.g:4988:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) )
+            // InternalGridSource.g:4989:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_0()); 
+            }
+            // InternalGridSource.g:4990:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_0 )
+            // InternalGridSource.g:4990:3: rule__JvmParameterizedTypeReference__TypeAssignment_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__TypeAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group__1"
+    // InternalGridSource.g:4998:1: rule__JvmParameterizedTypeReference__Group__1 : rule__JvmParameterizedTypeReference__Group__1__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5002:1: ( rule__JvmParameterizedTypeReference__Group__1__Impl )
+            // InternalGridSource.g:5003:2: rule__JvmParameterizedTypeReference__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group__1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group__1__Impl"
+    // InternalGridSource.g:5009:1: rule__JvmParameterizedTypeReference__Group__1__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? ) ;
+    public final void rule__JvmParameterizedTypeReference__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5013:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? ) )
+            // InternalGridSource.g:5014:1: ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? )
+            {
+            // InternalGridSource.g:5014:1: ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? )
+            // InternalGridSource.g:5015:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1()); 
+            }
+            // InternalGridSource.g:5016:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?
+            int alt29=2;
+            int LA29_0 = input.LA(1);
+
+            if ( (LA29_0==63) ) {
+                alt29=1;
+            }
+            switch (alt29) {
+                case 1 :
+                    // InternalGridSource.g:5016:3: rule__JvmParameterizedTypeReference__Group_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__JvmParameterizedTypeReference__Group_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group__1__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__0"
+    // InternalGridSource.g:5025:1: rule__JvmParameterizedTypeReference__Group_1__0 : rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5029:1: ( rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1 )
+            // InternalGridSource.g:5030:2: rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1
+            {
+            pushFollow(FOLLOW_58);
+            rule__JvmParameterizedTypeReference__Group_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__0__Impl"
+    // InternalGridSource.g:5037:1: rule__JvmParameterizedTypeReference__Group_1__0__Impl : ( ( '<' ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5041:1: ( ( ( '<' ) ) )
+            // InternalGridSource.g:5042:1: ( ( '<' ) )
+            {
+            // InternalGridSource.g:5042:1: ( ( '<' ) )
+            // InternalGridSource.g:5043:2: ( '<' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0()); 
+            }
+            // InternalGridSource.g:5044:2: ( '<' )
+            // InternalGridSource.g:5044:3: '<'
+            {
+            match(input,63,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__1"
+    // InternalGridSource.g:5052:1: rule__JvmParameterizedTypeReference__Group_1__1 : rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5056:1: ( rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2 )
+            // InternalGridSource.g:5057:2: rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2
+            {
+            pushFollow(FOLLOW_59);
+            rule__JvmParameterizedTypeReference__Group_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__1__Impl"
+    // InternalGridSource.g:5064:1: rule__JvmParameterizedTypeReference__Group_1__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5068:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) ) )
+            // InternalGridSource.g:5069:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) )
+            {
+            // InternalGridSource.g:5069:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) )
+            // InternalGridSource.g:5070:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_1()); 
+            }
+            // InternalGridSource.g:5071:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 )
+            // InternalGridSource.g:5071:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__1__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__2"
+    // InternalGridSource.g:5079:1: rule__JvmParameterizedTypeReference__Group_1__2 : rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5083:1: ( rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3 )
+            // InternalGridSource.g:5084:2: rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3
+            {
+            pushFollow(FOLLOW_59);
+            rule__JvmParameterizedTypeReference__Group_1__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__2"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__2__Impl"
+    // InternalGridSource.g:5091:1: rule__JvmParameterizedTypeReference__Group_1__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5095:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* ) )
+            // InternalGridSource.g:5096:1: ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* )
+            {
+            // InternalGridSource.g:5096:1: ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* )
+            // InternalGridSource.g:5097:2: ( rule__JvmParameterizedTypeReference__Group_1_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_2()); 
+            }
+            // InternalGridSource.g:5098:2: ( rule__JvmParameterizedTypeReference__Group_1_2__0 )*
+            loop30:
+            do {
+                int alt30=2;
+                int LA30_0 = input.LA(1);
+
+                if ( (LA30_0==62) ) {
+                    alt30=1;
+                }
+
+
+                switch (alt30) {
+            	case 1 :
+            	    // InternalGridSource.g:5098:3: rule__JvmParameterizedTypeReference__Group_1_2__0
+            	    {
+            	    pushFollow(FOLLOW_56);
+            	    rule__JvmParameterizedTypeReference__Group_1_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop30;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__2__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__3"
+    // InternalGridSource.g:5106:1: rule__JvmParameterizedTypeReference__Group_1__3 : rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5110:1: ( rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4 )
+            // InternalGridSource.g:5111:2: rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4
+            {
+            pushFollow(FOLLOW_21);
+            rule__JvmParameterizedTypeReference__Group_1__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__3"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__3__Impl"
+    // InternalGridSource.g:5118:1: rule__JvmParameterizedTypeReference__Group_1__3__Impl : ( '>' ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5122:1: ( ( '>' ) )
+            // InternalGridSource.g:5123:1: ( '>' )
+            {
+            // InternalGridSource.g:5123:1: ( '>' )
+            // InternalGridSource.g:5124:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3()); 
+            }
+            match(input,64,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__3__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__4"
+    // InternalGridSource.g:5133:1: rule__JvmParameterizedTypeReference__Group_1__4 : rule__JvmParameterizedTypeReference__Group_1__4__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5137:1: ( rule__JvmParameterizedTypeReference__Group_1__4__Impl )
+            // InternalGridSource.g:5138:2: rule__JvmParameterizedTypeReference__Group_1__4__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__4"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__4__Impl"
+    // InternalGridSource.g:5144:1: rule__JvmParameterizedTypeReference__Group_1__4__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5148:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* ) )
+            // InternalGridSource.g:5149:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* )
+            {
+            // InternalGridSource.g:5149:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* )
+            // InternalGridSource.g:5150:2: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4()); 
+            }
+            // InternalGridSource.g:5151:2: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )*
+            loop31:
+            do {
+                int alt31=2;
+                int LA31_0 = input.LA(1);
+
+                if ( (LA31_0==34) ) {
+                    alt31=1;
+                }
+
+
+                switch (alt31) {
+            	case 1 :
+            	    // InternalGridSource.g:5151:3: rule__JvmParameterizedTypeReference__Group_1_4__0
+            	    {
+            	    pushFollow(FOLLOW_46);
+            	    rule__JvmParameterizedTypeReference__Group_1_4__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop31;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1__4__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__0"
+    // InternalGridSource.g:5160:1: rule__JvmParameterizedTypeReference__Group_1_2__0 : rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5164:1: ( rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1 )
+            // InternalGridSource.g:5165:2: rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1
+            {
+            pushFollow(FOLLOW_58);
+            rule__JvmParameterizedTypeReference__Group_1_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_2__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__0__Impl"
+    // InternalGridSource.g:5172:1: rule__JvmParameterizedTypeReference__Group_1_2__0__Impl : ( ',' ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5176:1: ( ( ',' ) )
+            // InternalGridSource.g:5177:1: ( ',' )
+            {
+            // InternalGridSource.g:5177:1: ( ',' )
+            // InternalGridSource.g:5178:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0()); 
+            }
+            match(input,62,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_2__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__1"
+    // InternalGridSource.g:5187:1: rule__JvmParameterizedTypeReference__Group_1_2__1 : rule__JvmParameterizedTypeReference__Group_1_2__1__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5191:1: ( rule__JvmParameterizedTypeReference__Group_1_2__1__Impl )
+            // InternalGridSource.g:5192:2: rule__JvmParameterizedTypeReference__Group_1_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_2__1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__1__Impl"
+    // InternalGridSource.g:5198:1: rule__JvmParameterizedTypeReference__Group_1_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5202:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) ) )
+            // InternalGridSource.g:5203:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) )
+            {
+            // InternalGridSource.g:5203:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) )
+            // InternalGridSource.g:5204:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_2_1()); 
+            }
+            // InternalGridSource.g:5205:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 )
+            // InternalGridSource.g:5205:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_2__1__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__0"
+    // InternalGridSource.g:5214:1: rule__JvmParameterizedTypeReference__Group_1_4__0 : rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5218:1: ( rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1 )
+            // InternalGridSource.g:5219:2: rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1
+            {
+            pushFollow(FOLLOW_4);
+            rule__JvmParameterizedTypeReference__Group_1_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__0__Impl"
+    // InternalGridSource.g:5226:1: rule__JvmParameterizedTypeReference__Group_1_4__0__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5230:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) ) )
+            // InternalGridSource.g:5231:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) )
+            {
+            // InternalGridSource.g:5231:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) )
+            // InternalGridSource.g:5232:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0()); 
+            }
+            // InternalGridSource.g:5233:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 )
+            // InternalGridSource.g:5233:3: rule__JvmParameterizedTypeReference__Group_1_4_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__1"
+    // InternalGridSource.g:5241:1: rule__JvmParameterizedTypeReference__Group_1_4__1 : rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5245:1: ( rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2 )
+            // InternalGridSource.g:5246:2: rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2
+            {
+            pushFollow(FOLLOW_57);
+            rule__JvmParameterizedTypeReference__Group_1_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4__1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__1__Impl"
+    // InternalGridSource.g:5253:1: rule__JvmParameterizedTypeReference__Group_1_4__1__Impl : ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5257:1: ( ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) ) )
+            // InternalGridSource.g:5258:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) )
+            {
+            // InternalGridSource.g:5258:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) )
+            // InternalGridSource.g:5259:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_1_4_1()); 
+            }
+            // InternalGridSource.g:5260:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 )
+            // InternalGridSource.g:5260:3: rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_1_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4__1__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__2"
+    // InternalGridSource.g:5268:1: rule__JvmParameterizedTypeReference__Group_1_4__2 : rule__JvmParameterizedTypeReference__Group_1_4__2__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5272:1: ( rule__JvmParameterizedTypeReference__Group_1_4__2__Impl )
+            // InternalGridSource.g:5273:2: rule__JvmParameterizedTypeReference__Group_1_4__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4__2"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__2__Impl"
+    // InternalGridSource.g:5279:1: rule__JvmParameterizedTypeReference__Group_1_4__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5283:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? ) )
+            // InternalGridSource.g:5284:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? )
+            {
+            // InternalGridSource.g:5284:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? )
+            // InternalGridSource.g:5285:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2()); 
+            }
+            // InternalGridSource.g:5286:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?
+            int alt32=2;
+            int LA32_0 = input.LA(1);
+
+            if ( (LA32_0==63) ) {
+                alt32=1;
+            }
+            switch (alt32) {
+                case 1 :
+                    // InternalGridSource.g:5286:3: rule__JvmParameterizedTypeReference__Group_1_4_2__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__JvmParameterizedTypeReference__Group_1_4_2__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4__2__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0__0"
+    // InternalGridSource.g:5295:1: rule__JvmParameterizedTypeReference__Group_1_4_0__0 : rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5299:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl )
+            // InternalGridSource.g:5300:2: rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_0__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl"
+    // InternalGridSource.g:5306:1: rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5310:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) ) )
+            // InternalGridSource.g:5311:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) )
+            {
+            // InternalGridSource.g:5311:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) )
+            // InternalGridSource.g:5312:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0_0()); 
+            }
+            // InternalGridSource.g:5313:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 )
+            // InternalGridSource.g:5313:3: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_0_0__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0"
+    // InternalGridSource.g:5322:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 : rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5326:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 )
+            // InternalGridSource.g:5327:2: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1
+            {
+            pushFollow(FOLLOW_21);
+            rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_0_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl"
+    // InternalGridSource.g:5334:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl : ( () ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5338:1: ( ( () ) )
+            // InternalGridSource.g:5339:1: ( () )
+            {
+            // InternalGridSource.g:5339:1: ( () )
+            // InternalGridSource.g:5340:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0()); 
+            }
+            // InternalGridSource.g:5341:2: ()
+            // InternalGridSource.g:5341:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__1"
+    // InternalGridSource.g:5349:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 : rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5353:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl )
+            // InternalGridSource.g:5354:2: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_0_0__1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl"
+    // InternalGridSource.g:5360:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl : ( '.' ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5364:1: ( ( '.' ) )
+            // InternalGridSource.g:5365:1: ( '.' )
+            {
+            // InternalGridSource.g:5365:1: ( '.' )
+            // InternalGridSource.g:5366:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1()); 
+            }
+            match(input,34,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__0"
+    // InternalGridSource.g:5376:1: rule__JvmParameterizedTypeReference__Group_1_4_2__0 : rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5380:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1 )
+            // InternalGridSource.g:5381:2: rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1
+            {
+            pushFollow(FOLLOW_58);
+            rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl"
+    // InternalGridSource.g:5388:1: rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl : ( ( '<' ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5392:1: ( ( ( '<' ) ) )
+            // InternalGridSource.g:5393:1: ( ( '<' ) )
+            {
+            // InternalGridSource.g:5393:1: ( ( '<' ) )
+            // InternalGridSource.g:5394:2: ( '<' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0()); 
+            }
+            // InternalGridSource.g:5395:2: ( '<' )
+            // InternalGridSource.g:5395:3: '<'
+            {
+            match(input,63,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__1"
+    // InternalGridSource.g:5403:1: rule__JvmParameterizedTypeReference__Group_1_4_2__1 : rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5407:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2 )
+            // InternalGridSource.g:5408:2: rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2
+            {
+            pushFollow(FOLLOW_59);
+            rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_2__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl"
+    // InternalGridSource.g:5415:1: rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5419:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) ) )
+            // InternalGridSource.g:5420:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) )
+            {
+            // InternalGridSource.g:5420:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) )
+            // InternalGridSource.g:5421:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_1()); 
+            }
+            // InternalGridSource.g:5422:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 )
+            // InternalGridSource.g:5422:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__2"
+    // InternalGridSource.g:5430:1: rule__JvmParameterizedTypeReference__Group_1_4_2__2 : rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5434:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3 )
+            // InternalGridSource.g:5435:2: rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3
+            {
+            pushFollow(FOLLOW_59);
+            rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_2__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__2"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl"
+    // InternalGridSource.g:5442:1: rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5446:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* ) )
+            // InternalGridSource.g:5447:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* )
+            {
+            // InternalGridSource.g:5447:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* )
+            // InternalGridSource.g:5448:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2_2()); 
+            }
+            // InternalGridSource.g:5449:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )*
+            loop33:
+            do {
+                int alt33=2;
+                int LA33_0 = input.LA(1);
+
+                if ( (LA33_0==62) ) {
+                    alt33=1;
+                }
+
+
+                switch (alt33) {
+            	case 1 :
+            	    // InternalGridSource.g:5449:3: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0
+            	    {
+            	    pushFollow(FOLLOW_56);
+            	    rule__JvmParameterizedTypeReference__Group_1_4_2_2__0();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop33;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__3"
+    // InternalGridSource.g:5457:1: rule__JvmParameterizedTypeReference__Group_1_4_2__3 : rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5461:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl )
+            // InternalGridSource.g:5462:2: rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__3"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl"
+    // InternalGridSource.g:5468:1: rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl : ( '>' ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5472:1: ( ( '>' ) )
+            // InternalGridSource.g:5473:1: ( '>' )
+            {
+            // InternalGridSource.g:5473:1: ( '>' )
+            // InternalGridSource.g:5474:2: '>'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3()); 
+            }
+            match(input,64,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0"
+    // InternalGridSource.g:5484:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 : rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5488:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 )
+            // InternalGridSource.g:5489:2: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1
+            {
+            pushFollow(FOLLOW_58);
+            rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_2_2__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl"
+    // InternalGridSource.g:5496:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl : ( ',' ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5500:1: ( ( ',' ) )
+            // InternalGridSource.g:5501:1: ( ',' )
+            {
+            // InternalGridSource.g:5501:1: ( ',' )
+            // InternalGridSource.g:5502:2: ','
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0()); 
+            }
+            match(input,62,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__1"
+    // InternalGridSource.g:5511:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 : rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5515:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl )
+            // InternalGridSource.g:5516:2: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2_2__1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl"
+    // InternalGridSource.g:5522:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) ) ;
+    public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5526:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) ) )
+            // InternalGridSource.g:5527:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) )
+            {
+            // InternalGridSource.g:5527:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) )
+            // InternalGridSource.g:5528:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_2_1()); 
+            }
+            // InternalGridSource.g:5529:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 )
+            // InternalGridSource.g:5529:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_2_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group__0"
+    // InternalGridSource.g:5538:1: rule__JvmWildcardTypeReference__Group__0 : rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1 ;
+    public final void rule__JvmWildcardTypeReference__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5542:1: ( rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1 )
+            // InternalGridSource.g:5543:2: rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1
+            {
+            pushFollow(FOLLOW_58);
+            rule__JvmWildcardTypeReference__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group__0"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group__0__Impl"
+    // InternalGridSource.g:5550:1: rule__JvmWildcardTypeReference__Group__0__Impl : ( () ) ;
+    public final void rule__JvmWildcardTypeReference__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5554:1: ( ( () ) )
+            // InternalGridSource.g:5555:1: ( () )
+            {
+            // InternalGridSource.g:5555:1: ( () )
+            // InternalGridSource.g:5556:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0()); 
+            }
+            // InternalGridSource.g:5557:2: ()
+            // InternalGridSource.g:5557:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group__0__Impl"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group__1"
+    // InternalGridSource.g:5565:1: rule__JvmWildcardTypeReference__Group__1 : rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2 ;
+    public final void rule__JvmWildcardTypeReference__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5569:1: ( rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2 )
+            // InternalGridSource.g:5570:2: rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2
+            {
+            pushFollow(FOLLOW_60);
+            rule__JvmWildcardTypeReference__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group__1"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group__1__Impl"
+    // InternalGridSource.g:5577:1: rule__JvmWildcardTypeReference__Group__1__Impl : ( '?' ) ;
+    public final void rule__JvmWildcardTypeReference__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5581:1: ( ( '?' ) )
+            // InternalGridSource.g:5582:1: ( '?' )
+            {
+            // InternalGridSource.g:5582:1: ( '?' )
+            // InternalGridSource.g:5583:2: '?'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1()); 
+            }
+            match(input,65,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group__1__Impl"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group__2"
+    // InternalGridSource.g:5592:1: rule__JvmWildcardTypeReference__Group__2 : rule__JvmWildcardTypeReference__Group__2__Impl ;
+    public final void rule__JvmWildcardTypeReference__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5596:1: ( rule__JvmWildcardTypeReference__Group__2__Impl )
+            // InternalGridSource.g:5597:2: rule__JvmWildcardTypeReference__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group__2"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group__2__Impl"
+    // InternalGridSource.g:5603:1: rule__JvmWildcardTypeReference__Group__2__Impl : ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? ) ;
+    public final void rule__JvmWildcardTypeReference__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5607:1: ( ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? ) )
+            // InternalGridSource.g:5608:1: ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? )
+            {
+            // InternalGridSource.g:5608:1: ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? )
+            // InternalGridSource.g:5609:2: ( rule__JvmWildcardTypeReference__Alternatives_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getAlternatives_2()); 
+            }
+            // InternalGridSource.g:5610:2: ( rule__JvmWildcardTypeReference__Alternatives_2 )?
+            int alt34=2;
+            int LA34_0 = input.LA(1);
+
+            if ( (LA34_0==66||LA34_0==68) ) {
+                alt34=1;
+            }
+            switch (alt34) {
+                case 1 :
+                    // InternalGridSource.g:5610:3: rule__JvmWildcardTypeReference__Alternatives_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__JvmWildcardTypeReference__Alternatives_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getAlternatives_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group__2__Impl"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__0"
+    // InternalGridSource.g:5619:1: rule__JvmWildcardTypeReference__Group_2_0__0 : rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1 ;
+    public final void rule__JvmWildcardTypeReference__Group_2_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5623:1: ( rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1 )
+            // InternalGridSource.g:5624:2: rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1
+            {
+            pushFollow(FOLLOW_61);
+            rule__JvmWildcardTypeReference__Group_2_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group_2_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_0__0"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__0__Impl"
+    // InternalGridSource.g:5631:1: rule__JvmWildcardTypeReference__Group_2_0__0__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) ) ;
+    public final void rule__JvmWildcardTypeReference__Group_2_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5635:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) ) )
+            // InternalGridSource.g:5636:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) )
+            {
+            // InternalGridSource.g:5636:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) )
+            // InternalGridSource.g:5637:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_0()); 
+            }
+            // InternalGridSource.g:5638:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 )
+            // InternalGridSource.g:5638:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_0__0__Impl"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__1"
+    // InternalGridSource.g:5646:1: rule__JvmWildcardTypeReference__Group_2_0__1 : rule__JvmWildcardTypeReference__Group_2_0__1__Impl ;
+    public final void rule__JvmWildcardTypeReference__Group_2_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5650:1: ( rule__JvmWildcardTypeReference__Group_2_0__1__Impl )
+            // InternalGridSource.g:5651:2: rule__JvmWildcardTypeReference__Group_2_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group_2_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_0__1"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__1__Impl"
+    // InternalGridSource.g:5657:1: rule__JvmWildcardTypeReference__Group_2_0__1__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* ) ;
+    public final void rule__JvmWildcardTypeReference__Group_2_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5661:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* ) )
+            // InternalGridSource.g:5662:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* )
+            {
+            // InternalGridSource.g:5662:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* )
+            // InternalGridSource.g:5663:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_1()); 
+            }
+            // InternalGridSource.g:5664:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )*
+            loop35:
+            do {
+                int alt35=2;
+                int LA35_0 = input.LA(1);
+
+                if ( (LA35_0==67) ) {
+                    alt35=1;
+                }
+
+
+                switch (alt35) {
+            	case 1 :
+            	    // InternalGridSource.g:5664:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1
+            	    {
+            	    pushFollow(FOLLOW_62);
+            	    rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop35;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_0__1__Impl"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__0"
+    // InternalGridSource.g:5673:1: rule__JvmWildcardTypeReference__Group_2_1__0 : rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1 ;
+    public final void rule__JvmWildcardTypeReference__Group_2_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5677:1: ( rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1 )
+            // InternalGridSource.g:5678:2: rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1
+            {
+            pushFollow(FOLLOW_61);
+            rule__JvmWildcardTypeReference__Group_2_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group_2_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_1__0"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__0__Impl"
+    // InternalGridSource.g:5685:1: rule__JvmWildcardTypeReference__Group_2_1__0__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) ) ;
+    public final void rule__JvmWildcardTypeReference__Group_2_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5689:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) ) )
+            // InternalGridSource.g:5690:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) )
+            {
+            // InternalGridSource.g:5690:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) )
+            // InternalGridSource.g:5691:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_0()); 
+            }
+            // InternalGridSource.g:5692:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 )
+            // InternalGridSource.g:5692:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_1__0__Impl"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__1"
+    // InternalGridSource.g:5700:1: rule__JvmWildcardTypeReference__Group_2_1__1 : rule__JvmWildcardTypeReference__Group_2_1__1__Impl ;
+    public final void rule__JvmWildcardTypeReference__Group_2_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5704:1: ( rule__JvmWildcardTypeReference__Group_2_1__1__Impl )
+            // InternalGridSource.g:5705:2: rule__JvmWildcardTypeReference__Group_2_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmWildcardTypeReference__Group_2_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_1__1"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__1__Impl"
+    // InternalGridSource.g:5711:1: rule__JvmWildcardTypeReference__Group_2_1__1__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* ) ;
+    public final void rule__JvmWildcardTypeReference__Group_2_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5715:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* ) )
+            // InternalGridSource.g:5716:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* )
+            {
+            // InternalGridSource.g:5716:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* )
+            // InternalGridSource.g:5717:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_1()); 
+            }
+            // InternalGridSource.g:5718:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )*
+            loop36:
+            do {
+                int alt36=2;
+                int LA36_0 = input.LA(1);
+
+                if ( (LA36_0==67) ) {
+                    alt36=1;
+                }
+
+
+                switch (alt36) {
+            	case 1 :
+            	    // InternalGridSource.g:5718:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1
+            	    {
+            	    pushFollow(FOLLOW_62);
+            	    rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop36;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__Group_2_1__1__Impl"
+
+
+    // $ANTLR start "rule__JvmUpperBound__Group__0"
+    // InternalGridSource.g:5727:1: rule__JvmUpperBound__Group__0 : rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1 ;
+    public final void rule__JvmUpperBound__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5731:1: ( rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1 )
+            // InternalGridSource.g:5732:2: rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1
+            {
+            pushFollow(FOLLOW_6);
+            rule__JvmUpperBound__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBound__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBound__Group__0"
+
+
+    // $ANTLR start "rule__JvmUpperBound__Group__0__Impl"
+    // InternalGridSource.g:5739:1: rule__JvmUpperBound__Group__0__Impl : ( 'extends' ) ;
+    public final void rule__JvmUpperBound__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5743:1: ( ( 'extends' ) )
+            // InternalGridSource.g:5744:1: ( 'extends' )
+            {
+            // InternalGridSource.g:5744:1: ( 'extends' )
+            // InternalGridSource.g:5745:2: 'extends'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0()); 
+            }
+            match(input,66,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBound__Group__0__Impl"
+
+
+    // $ANTLR start "rule__JvmUpperBound__Group__1"
+    // InternalGridSource.g:5754:1: rule__JvmUpperBound__Group__1 : rule__JvmUpperBound__Group__1__Impl ;
+    public final void rule__JvmUpperBound__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5758:1: ( rule__JvmUpperBound__Group__1__Impl )
+            // InternalGridSource.g:5759:2: rule__JvmUpperBound__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBound__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBound__Group__1"
+
+
+    // $ANTLR start "rule__JvmUpperBound__Group__1__Impl"
+    // InternalGridSource.g:5765:1: rule__JvmUpperBound__Group__1__Impl : ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) ) ;
+    public final void rule__JvmUpperBound__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5769:1: ( ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) ) )
+            // InternalGridSource.g:5770:1: ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) )
+            {
+            // InternalGridSource.g:5770:1: ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) )
+            // InternalGridSource.g:5771:2: ( rule__JvmUpperBound__TypeReferenceAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceAssignment_1()); 
+            }
+            // InternalGridSource.g:5772:2: ( rule__JvmUpperBound__TypeReferenceAssignment_1 )
+            // InternalGridSource.g:5772:3: rule__JvmUpperBound__TypeReferenceAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBound__TypeReferenceAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBound__Group__1__Impl"
+
+
+    // $ANTLR start "rule__JvmUpperBoundAnded__Group__0"
+    // InternalGridSource.g:5781:1: rule__JvmUpperBoundAnded__Group__0 : rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1 ;
+    public final void rule__JvmUpperBoundAnded__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5785:1: ( rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1 )
+            // InternalGridSource.g:5786:2: rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1
+            {
+            pushFollow(FOLLOW_6);
+            rule__JvmUpperBoundAnded__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBoundAnded__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBoundAnded__Group__0"
+
+
+    // $ANTLR start "rule__JvmUpperBoundAnded__Group__0__Impl"
+    // InternalGridSource.g:5793:1: rule__JvmUpperBoundAnded__Group__0__Impl : ( '&' ) ;
+    public final void rule__JvmUpperBoundAnded__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5797:1: ( ( '&' ) )
+            // InternalGridSource.g:5798:1: ( '&' )
+            {
+            // InternalGridSource.g:5798:1: ( '&' )
+            // InternalGridSource.g:5799:2: '&'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0()); 
+            }
+            match(input,67,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBoundAnded__Group__0__Impl"
+
+
+    // $ANTLR start "rule__JvmUpperBoundAnded__Group__1"
+    // InternalGridSource.g:5808:1: rule__JvmUpperBoundAnded__Group__1 : rule__JvmUpperBoundAnded__Group__1__Impl ;
+    public final void rule__JvmUpperBoundAnded__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5812:1: ( rule__JvmUpperBoundAnded__Group__1__Impl )
+            // InternalGridSource.g:5813:2: rule__JvmUpperBoundAnded__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBoundAnded__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBoundAnded__Group__1"
+
+
+    // $ANTLR start "rule__JvmUpperBoundAnded__Group__1__Impl"
+    // InternalGridSource.g:5819:1: rule__JvmUpperBoundAnded__Group__1__Impl : ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) ) ;
+    public final void rule__JvmUpperBoundAnded__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5823:1: ( ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) ) )
+            // InternalGridSource.g:5824:1: ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) )
+            {
+            // InternalGridSource.g:5824:1: ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) )
+            // InternalGridSource.g:5825:2: ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceAssignment_1()); 
+            }
+            // InternalGridSource.g:5826:2: ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 )
+            // InternalGridSource.g:5826:3: rule__JvmUpperBoundAnded__TypeReferenceAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmUpperBoundAnded__TypeReferenceAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBoundAnded__Group__1__Impl"
+
+
+    // $ANTLR start "rule__JvmLowerBound__Group__0"
+    // InternalGridSource.g:5835:1: rule__JvmLowerBound__Group__0 : rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1 ;
+    public final void rule__JvmLowerBound__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5839:1: ( rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1 )
+            // InternalGridSource.g:5840:2: rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1
+            {
+            pushFollow(FOLLOW_6);
+            rule__JvmLowerBound__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBound__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBound__Group__0"
+
+
+    // $ANTLR start "rule__JvmLowerBound__Group__0__Impl"
+    // InternalGridSource.g:5847:1: rule__JvmLowerBound__Group__0__Impl : ( 'super' ) ;
+    public final void rule__JvmLowerBound__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5851:1: ( ( 'super' ) )
+            // InternalGridSource.g:5852:1: ( 'super' )
+            {
+            // InternalGridSource.g:5852:1: ( 'super' )
+            // InternalGridSource.g:5853:2: 'super'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0()); 
+            }
+            match(input,68,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBound__Group__0__Impl"
+
+
+    // $ANTLR start "rule__JvmLowerBound__Group__1"
+    // InternalGridSource.g:5862:1: rule__JvmLowerBound__Group__1 : rule__JvmLowerBound__Group__1__Impl ;
+    public final void rule__JvmLowerBound__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5866:1: ( rule__JvmLowerBound__Group__1__Impl )
+            // InternalGridSource.g:5867:2: rule__JvmLowerBound__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBound__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBound__Group__1"
+
+
+    // $ANTLR start "rule__JvmLowerBound__Group__1__Impl"
+    // InternalGridSource.g:5873:1: rule__JvmLowerBound__Group__1__Impl : ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) ) ;
+    public final void rule__JvmLowerBound__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5877:1: ( ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) ) )
+            // InternalGridSource.g:5878:1: ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) )
+            {
+            // InternalGridSource.g:5878:1: ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) )
+            // InternalGridSource.g:5879:2: ( rule__JvmLowerBound__TypeReferenceAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceAssignment_1()); 
+            }
+            // InternalGridSource.g:5880:2: ( rule__JvmLowerBound__TypeReferenceAssignment_1 )
+            // InternalGridSource.g:5880:3: rule__JvmLowerBound__TypeReferenceAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBound__TypeReferenceAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBound__Group__1__Impl"
+
+
+    // $ANTLR start "rule__JvmLowerBoundAnded__Group__0"
+    // InternalGridSource.g:5889:1: rule__JvmLowerBoundAnded__Group__0 : rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1 ;
+    public final void rule__JvmLowerBoundAnded__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5893:1: ( rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1 )
+            // InternalGridSource.g:5894:2: rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1
+            {
+            pushFollow(FOLLOW_6);
+            rule__JvmLowerBoundAnded__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBoundAnded__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBoundAnded__Group__0"
+
+
+    // $ANTLR start "rule__JvmLowerBoundAnded__Group__0__Impl"
+    // InternalGridSource.g:5901:1: rule__JvmLowerBoundAnded__Group__0__Impl : ( '&' ) ;
+    public final void rule__JvmLowerBoundAnded__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5905:1: ( ( '&' ) )
+            // InternalGridSource.g:5906:1: ( '&' )
+            {
+            // InternalGridSource.g:5906:1: ( '&' )
+            // InternalGridSource.g:5907:2: '&'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0()); 
+            }
+            match(input,67,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBoundAnded__Group__0__Impl"
+
+
+    // $ANTLR start "rule__JvmLowerBoundAnded__Group__1"
+    // InternalGridSource.g:5916:1: rule__JvmLowerBoundAnded__Group__1 : rule__JvmLowerBoundAnded__Group__1__Impl ;
+    public final void rule__JvmLowerBoundAnded__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5920:1: ( rule__JvmLowerBoundAnded__Group__1__Impl )
+            // InternalGridSource.g:5921:2: rule__JvmLowerBoundAnded__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBoundAnded__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBoundAnded__Group__1"
+
+
+    // $ANTLR start "rule__JvmLowerBoundAnded__Group__1__Impl"
+    // InternalGridSource.g:5927:1: rule__JvmLowerBoundAnded__Group__1__Impl : ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) ) ;
+    public final void rule__JvmLowerBoundAnded__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5931:1: ( ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) ) )
+            // InternalGridSource.g:5932:1: ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) )
+            {
+            // InternalGridSource.g:5932:1: ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) )
+            // InternalGridSource.g:5933:2: ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceAssignment_1()); 
+            }
+            // InternalGridSource.g:5934:2: ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 )
+            // InternalGridSource.g:5934:3: rule__JvmLowerBoundAnded__TypeReferenceAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__JvmLowerBoundAnded__TypeReferenceAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBoundAnded__Group__1__Impl"
+
+
+    // $ANTLR start "rule__QualifiedNameWithWildcard__Group__0"
+    // InternalGridSource.g:5943:1: rule__QualifiedNameWithWildcard__Group__0 : rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1 ;
+    public final void rule__QualifiedNameWithWildcard__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5947:1: ( rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1 )
+            // InternalGridSource.g:5948:2: rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1
+            {
+            pushFollow(FOLLOW_21);
+            rule__QualifiedNameWithWildcard__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__QualifiedNameWithWildcard__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameWithWildcard__Group__0"
+
+
+    // $ANTLR start "rule__QualifiedNameWithWildcard__Group__0__Impl"
+    // InternalGridSource.g:5955:1: rule__QualifiedNameWithWildcard__Group__0__Impl : ( ruleQualifiedName ) ;
+    public final void rule__QualifiedNameWithWildcard__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5959:1: ( ( ruleQualifiedName ) )
+            // InternalGridSource.g:5960:1: ( ruleQualifiedName )
+            {
+            // InternalGridSource.g:5960:1: ( ruleQualifiedName )
+            // InternalGridSource.g:5961:2: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameWithWildcard__Group__0__Impl"
+
+
+    // $ANTLR start "rule__QualifiedNameWithWildcard__Group__1"
+    // InternalGridSource.g:5970:1: rule__QualifiedNameWithWildcard__Group__1 : rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2 ;
+    public final void rule__QualifiedNameWithWildcard__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5974:1: ( rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2 )
+            // InternalGridSource.g:5975:2: rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2
+            {
+            pushFollow(FOLLOW_63);
+            rule__QualifiedNameWithWildcard__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__QualifiedNameWithWildcard__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameWithWildcard__Group__1"
+
+
+    // $ANTLR start "rule__QualifiedNameWithWildcard__Group__1__Impl"
+    // InternalGridSource.g:5982:1: rule__QualifiedNameWithWildcard__Group__1__Impl : ( '.' ) ;
+    public final void rule__QualifiedNameWithWildcard__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:5986:1: ( ( '.' ) )
+            // InternalGridSource.g:5987:1: ( '.' )
+            {
+            // InternalGridSource.g:5987:1: ( '.' )
+            // InternalGridSource.g:5988:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1()); 
+            }
+            match(input,34,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameWithWildcard__Group__1__Impl"
+
+
+    // $ANTLR start "rule__QualifiedNameWithWildcard__Group__2"
+    // InternalGridSource.g:5997:1: rule__QualifiedNameWithWildcard__Group__2 : rule__QualifiedNameWithWildcard__Group__2__Impl ;
+    public final void rule__QualifiedNameWithWildcard__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6001:1: ( rule__QualifiedNameWithWildcard__Group__2__Impl )
+            // InternalGridSource.g:6002:2: rule__QualifiedNameWithWildcard__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__QualifiedNameWithWildcard__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameWithWildcard__Group__2"
+
+
+    // $ANTLR start "rule__QualifiedNameWithWildcard__Group__2__Impl"
+    // InternalGridSource.g:6008:1: rule__QualifiedNameWithWildcard__Group__2__Impl : ( '*' ) ;
+    public final void rule__QualifiedNameWithWildcard__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6012:1: ( ( '*' ) )
+            // InternalGridSource.g:6013:1: ( '*' )
+            {
+            // InternalGridSource.g:6013:1: ( '*' )
+            // InternalGridSource.g:6014:2: '*'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameWithWildcard__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group__0"
+    // InternalGridSource.g:6024:1: rule__XImportDeclaration__Group__0 : rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1 ;
+    public final void rule__XImportDeclaration__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6028:1: ( rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1 )
+            // InternalGridSource.g:6029:2: rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1
+            {
+            pushFollow(FOLLOW_64);
+            rule__XImportDeclaration__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group__0"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group__0__Impl"
+    // InternalGridSource.g:6036:1: rule__XImportDeclaration__Group__0__Impl : ( 'import' ) ;
+    public final void rule__XImportDeclaration__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6040:1: ( ( 'import' ) )
+            // InternalGridSource.g:6041:1: ( 'import' )
+            {
+            // InternalGridSource.g:6041:1: ( 'import' )
+            // InternalGridSource.g:6042:2: 'import'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportKeyword_0()); 
+            }
+            match(input,70,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportKeyword_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group__0__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group__1"
+    // InternalGridSource.g:6051:1: rule__XImportDeclaration__Group__1 : rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2 ;
+    public final void rule__XImportDeclaration__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6055:1: ( rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2 )
+            // InternalGridSource.g:6056:2: rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2
+            {
+            pushFollow(FOLLOW_65);
+            rule__XImportDeclaration__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group__1"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group__1__Impl"
+    // InternalGridSource.g:6063:1: rule__XImportDeclaration__Group__1__Impl : ( ( rule__XImportDeclaration__Alternatives_1 ) ) ;
+    public final void rule__XImportDeclaration__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6067:1: ( ( ( rule__XImportDeclaration__Alternatives_1 ) ) )
+            // InternalGridSource.g:6068:1: ( ( rule__XImportDeclaration__Alternatives_1 ) )
+            {
+            // InternalGridSource.g:6068:1: ( ( rule__XImportDeclaration__Alternatives_1 ) )
+            // InternalGridSource.g:6069:2: ( rule__XImportDeclaration__Alternatives_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getAlternatives_1()); 
+            }
+            // InternalGridSource.g:6070:2: ( rule__XImportDeclaration__Alternatives_1 )
+            // InternalGridSource.g:6070:3: rule__XImportDeclaration__Alternatives_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Alternatives_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getAlternatives_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group__1__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group__2"
+    // InternalGridSource.g:6078:1: rule__XImportDeclaration__Group__2 : rule__XImportDeclaration__Group__2__Impl ;
+    public final void rule__XImportDeclaration__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6082:1: ( rule__XImportDeclaration__Group__2__Impl )
+            // InternalGridSource.g:6083:2: rule__XImportDeclaration__Group__2__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group__2"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group__2__Impl"
+    // InternalGridSource.g:6089:1: rule__XImportDeclaration__Group__2__Impl : ( ( ';' )? ) ;
+    public final void rule__XImportDeclaration__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6093:1: ( ( ( ';' )? ) )
+            // InternalGridSource.g:6094:1: ( ( ';' )? )
+            {
+            // InternalGridSource.g:6094:1: ( ( ';' )? )
+            // InternalGridSource.g:6095:2: ( ';' )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_2()); 
+            }
+            // InternalGridSource.g:6096:2: ( ';' )?
+            int alt37=2;
+            int LA37_0 = input.LA(1);
+
+            if ( (LA37_0==71) ) {
+                alt37=1;
+            }
+            switch (alt37) {
+                case 1 :
+                    // InternalGridSource.g:6096:3: ';'
+                    {
+                    match(input,71,FOLLOW_2); if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group__2__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_1_0__0"
+    // InternalGridSource.g:6105:1: rule__XImportDeclaration__Group_1_0__0 : rule__XImportDeclaration__Group_1_0__0__Impl rule__XImportDeclaration__Group_1_0__1 ;
+    public final void rule__XImportDeclaration__Group_1_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6109:1: ( rule__XImportDeclaration__Group_1_0__0__Impl rule__XImportDeclaration__Group_1_0__1 )
+            // InternalGridSource.g:6110:2: rule__XImportDeclaration__Group_1_0__0__Impl rule__XImportDeclaration__Group_1_0__1
+            {
+            pushFollow(FOLLOW_66);
+            rule__XImportDeclaration__Group_1_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group_1_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_1_0__0"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_1_0__0__Impl"
+    // InternalGridSource.g:6117:1: rule__XImportDeclaration__Group_1_0__0__Impl : ( ( rule__XImportDeclaration__StaticAssignment_1_0_0 ) ) ;
+    public final void rule__XImportDeclaration__Group_1_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6121:1: ( ( ( rule__XImportDeclaration__StaticAssignment_1_0_0 ) ) )
+            // InternalGridSource.g:6122:1: ( ( rule__XImportDeclaration__StaticAssignment_1_0_0 ) )
+            {
+            // InternalGridSource.g:6122:1: ( ( rule__XImportDeclaration__StaticAssignment_1_0_0 ) )
+            // InternalGridSource.g:6123:2: ( rule__XImportDeclaration__StaticAssignment_1_0_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_1_0_0()); 
+            }
+            // InternalGridSource.g:6124:2: ( rule__XImportDeclaration__StaticAssignment_1_0_0 )
+            // InternalGridSource.g:6124:3: rule__XImportDeclaration__StaticAssignment_1_0_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__StaticAssignment_1_0_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_1_0__0__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_1_0__1"
+    // InternalGridSource.g:6132:1: rule__XImportDeclaration__Group_1_0__1 : rule__XImportDeclaration__Group_1_0__1__Impl rule__XImportDeclaration__Group_1_0__2 ;
+    public final void rule__XImportDeclaration__Group_1_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6136:1: ( rule__XImportDeclaration__Group_1_0__1__Impl rule__XImportDeclaration__Group_1_0__2 )
+            // InternalGridSource.g:6137:2: rule__XImportDeclaration__Group_1_0__1__Impl rule__XImportDeclaration__Group_1_0__2
+            {
+            pushFollow(FOLLOW_66);
+            rule__XImportDeclaration__Group_1_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group_1_0__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_1_0__1"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_1_0__1__Impl"
+    // InternalGridSource.g:6144:1: rule__XImportDeclaration__Group_1_0__1__Impl : ( ( rule__XImportDeclaration__ExtensionAssignment_1_0_1 )? ) ;
+    public final void rule__XImportDeclaration__Group_1_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6148:1: ( ( ( rule__XImportDeclaration__ExtensionAssignment_1_0_1 )? ) )
+            // InternalGridSource.g:6149:1: ( ( rule__XImportDeclaration__ExtensionAssignment_1_0_1 )? )
+            {
+            // InternalGridSource.g:6149:1: ( ( rule__XImportDeclaration__ExtensionAssignment_1_0_1 )? )
+            // InternalGridSource.g:6150:2: ( rule__XImportDeclaration__ExtensionAssignment_1_0_1 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_1_0_1()); 
+            }
+            // InternalGridSource.g:6151:2: ( rule__XImportDeclaration__ExtensionAssignment_1_0_1 )?
+            int alt38=2;
+            int LA38_0 = input.LA(1);
+
+            if ( (LA38_0==73) ) {
+                alt38=1;
+            }
+            switch (alt38) {
+                case 1 :
+                    // InternalGridSource.g:6151:3: rule__XImportDeclaration__ExtensionAssignment_1_0_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__XImportDeclaration__ExtensionAssignment_1_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_1_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_1_0__1__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_1_0__2"
+    // InternalGridSource.g:6159:1: rule__XImportDeclaration__Group_1_0__2 : rule__XImportDeclaration__Group_1_0__2__Impl rule__XImportDeclaration__Group_1_0__3 ;
+    public final void rule__XImportDeclaration__Group_1_0__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6163:1: ( rule__XImportDeclaration__Group_1_0__2__Impl rule__XImportDeclaration__Group_1_0__3 )
+            // InternalGridSource.g:6164:2: rule__XImportDeclaration__Group_1_0__2__Impl rule__XImportDeclaration__Group_1_0__3
+            {
+            pushFollow(FOLLOW_67);
+            rule__XImportDeclaration__Group_1_0__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group_1_0__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_1_0__2"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_1_0__2__Impl"
+    // InternalGridSource.g:6171:1: rule__XImportDeclaration__Group_1_0__2__Impl : ( ( rule__XImportDeclaration__ImportedTypeAssignment_1_0_2 ) ) ;
+    public final void rule__XImportDeclaration__Group_1_0__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6175:1: ( ( ( rule__XImportDeclaration__ImportedTypeAssignment_1_0_2 ) ) )
+            // InternalGridSource.g:6176:1: ( ( rule__XImportDeclaration__ImportedTypeAssignment_1_0_2 ) )
+            {
+            // InternalGridSource.g:6176:1: ( ( rule__XImportDeclaration__ImportedTypeAssignment_1_0_2 ) )
+            // InternalGridSource.g:6177:2: ( rule__XImportDeclaration__ImportedTypeAssignment_1_0_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_0_2()); 
+            }
+            // InternalGridSource.g:6178:2: ( rule__XImportDeclaration__ImportedTypeAssignment_1_0_2 )
+            // InternalGridSource.g:6178:3: rule__XImportDeclaration__ImportedTypeAssignment_1_0_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__ImportedTypeAssignment_1_0_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_0_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_1_0__2__Impl"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_1_0__3"
+    // InternalGridSource.g:6186:1: rule__XImportDeclaration__Group_1_0__3 : rule__XImportDeclaration__Group_1_0__3__Impl ;
+    public final void rule__XImportDeclaration__Group_1_0__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6190:1: ( rule__XImportDeclaration__Group_1_0__3__Impl )
+            // InternalGridSource.g:6191:2: rule__XImportDeclaration__Group_1_0__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Group_1_0__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_1_0__3"
+
+
+    // $ANTLR start "rule__XImportDeclaration__Group_1_0__3__Impl"
+    // InternalGridSource.g:6197:1: rule__XImportDeclaration__Group_1_0__3__Impl : ( ( rule__XImportDeclaration__Alternatives_1_0_3 ) ) ;
+    public final void rule__XImportDeclaration__Group_1_0__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6201:1: ( ( ( rule__XImportDeclaration__Alternatives_1_0_3 ) ) )
+            // InternalGridSource.g:6202:1: ( ( rule__XImportDeclaration__Alternatives_1_0_3 ) )
+            {
+            // InternalGridSource.g:6202:1: ( ( rule__XImportDeclaration__Alternatives_1_0_3 ) )
+            // InternalGridSource.g:6203:2: ( rule__XImportDeclaration__Alternatives_1_0_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getAlternatives_1_0_3()); 
+            }
+            // InternalGridSource.g:6204:2: ( rule__XImportDeclaration__Alternatives_1_0_3 )
+            // InternalGridSource.g:6204:3: rule__XImportDeclaration__Alternatives_1_0_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__XImportDeclaration__Alternatives_1_0_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getAlternatives_1_0_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__Group_1_0__3__Impl"
+
+
+    // $ANTLR start "rule__QualifiedNameInStaticImport__Group__0"
+    // InternalGridSource.g:6213:1: rule__QualifiedNameInStaticImport__Group__0 : rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1 ;
+    public final void rule__QualifiedNameInStaticImport__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6217:1: ( rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1 )
+            // InternalGridSource.g:6218:2: rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1
+            {
+            pushFollow(FOLLOW_21);
+            rule__QualifiedNameInStaticImport__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__QualifiedNameInStaticImport__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameInStaticImport__Group__0"
+
+
+    // $ANTLR start "rule__QualifiedNameInStaticImport__Group__0__Impl"
+    // InternalGridSource.g:6225:1: rule__QualifiedNameInStaticImport__Group__0__Impl : ( ruleValidID ) ;
+    public final void rule__QualifiedNameInStaticImport__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6229:1: ( ( ruleValidID ) )
+            // InternalGridSource.g:6230:1: ( ruleValidID )
+            {
+            // InternalGridSource.g:6230:1: ( ruleValidID )
+            // InternalGridSource.g:6231:2: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameInStaticImport__Group__0__Impl"
+
+
+    // $ANTLR start "rule__QualifiedNameInStaticImport__Group__1"
+    // InternalGridSource.g:6240:1: rule__QualifiedNameInStaticImport__Group__1 : rule__QualifiedNameInStaticImport__Group__1__Impl ;
+    public final void rule__QualifiedNameInStaticImport__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6244:1: ( rule__QualifiedNameInStaticImport__Group__1__Impl )
+            // InternalGridSource.g:6245:2: rule__QualifiedNameInStaticImport__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__QualifiedNameInStaticImport__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameInStaticImport__Group__1"
+
+
+    // $ANTLR start "rule__QualifiedNameInStaticImport__Group__1__Impl"
+    // InternalGridSource.g:6251:1: rule__QualifiedNameInStaticImport__Group__1__Impl : ( '.' ) ;
+    public final void rule__QualifiedNameInStaticImport__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6255:1: ( ( '.' ) )
+            // InternalGridSource.g:6256:1: ( '.' )
+            {
+            // InternalGridSource.g:6256:1: ( '.' )
+            // InternalGridSource.g:6257:2: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1()); 
+            }
+            match(input,34,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__QualifiedNameInStaticImport__Group__1__Impl"
+
+
+    // $ANTLR start "rule__Source__IdAssignment_1"
+    // InternalGridSource.g:6267:1: rule__Source__IdAssignment_1 : ( ruleQualifiedName ) ;
+    public final void rule__Source__IdAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6271:1: ( ( ruleQualifiedName ) )
+            // InternalGridSource.g:6272:2: ( ruleQualifiedName )
+            {
+            // InternalGridSource.g:6272:2: ( ruleQualifiedName )
+            // InternalGridSource.g:6273:3: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getIdQualifiedNameParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getIdQualifiedNameParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__IdAssignment_1"
+
+
+    // $ANTLR start "rule__Source__RootTypeAssignment_3"
+    // InternalGridSource.g:6282:1: rule__Source__RootTypeAssignment_3 : ( ruleJvmTypeReference ) ;
+    public final void rule__Source__RootTypeAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6286:1: ( ( ruleJvmTypeReference ) )
+            // InternalGridSource.g:6287:2: ( ruleJvmTypeReference )
+            {
+            // InternalGridSource.g:6287:2: ( ruleJvmTypeReference )
+            // InternalGridSource.g:6288:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getRootTypeJvmTypeReferenceParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getRootTypeJvmTypeReferenceParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__RootTypeAssignment_3"
+
+
+    // $ANTLR start "rule__Source__InputsAssignment_7"
+    // InternalGridSource.g:6297:1: rule__Source__InputsAssignment_7 : ( ruleInput ) ;
+    public final void rule__Source__InputsAssignment_7() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6301:1: ( ( ruleInput ) )
+            // InternalGridSource.g:6302:2: ( ruleInput )
+            {
+            // InternalGridSource.g:6302:2: ( ruleInput )
+            // InternalGridSource.g:6303:3: ruleInput
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getInputsInputParserRuleCall_7_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleInput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getInputsInputParserRuleCall_7_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__InputsAssignment_7"
+
+
+    // $ANTLR start "rule__Source__PropertiesAssignment_9"
+    // InternalGridSource.g:6312:1: rule__Source__PropertiesAssignment_9 : ( ruleProperty ) ;
+    public final void rule__Source__PropertiesAssignment_9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6316:1: ( ( ruleProperty ) )
+            // InternalGridSource.g:6317:2: ( ruleProperty )
+            {
+            // InternalGridSource.g:6317:2: ( ruleProperty )
+            // InternalGridSource.g:6318:3: ruleProperty
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getPropertiesPropertyParserRuleCall_9_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleProperty();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceAccess().getPropertiesPropertyParserRuleCall_9_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Source__PropertiesAssignment_9"
+
+
+    // $ANTLR start "rule__Input__InputTypeAssignment_1"
+    // InternalGridSource.g:6327:1: rule__Input__InputTypeAssignment_1 : ( ruleJvmTypeReference ) ;
+    public final void rule__Input__InputTypeAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6331:1: ( ( ruleJvmTypeReference ) )
+            // InternalGridSource.g:6332:2: ( ruleJvmTypeReference )
+            {
+            // InternalGridSource.g:6332:2: ( ruleJvmTypeReference )
+            // InternalGridSource.g:6333:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getInputTypeJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputAccess().getInputTypeJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__InputTypeAssignment_1"
+
+
+    // $ANTLR start "rule__Input__FiltersAssignment_3"
+    // InternalGridSource.g:6342:1: rule__Input__FiltersAssignment_3 : ( ruleEQFilter ) ;
+    public final void rule__Input__FiltersAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6346:1: ( ( ruleEQFilter ) )
+            // InternalGridSource.g:6347:2: ( ruleEQFilter )
+            {
+            // InternalGridSource.g:6347:2: ( ruleEQFilter )
+            // InternalGridSource.g:6348:3: ruleEQFilter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEQFilter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__FiltersAssignment_3"
+
+
+    // $ANTLR start "rule__Input__FiltersAssignment_4_1"
+    // InternalGridSource.g:6357:1: rule__Input__FiltersAssignment_4_1 : ( ruleEQFilter ) ;
+    public final void rule__Input__FiltersAssignment_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6361:1: ( ( ruleEQFilter ) )
+            // InternalGridSource.g:6362:2: ( ruleEQFilter )
+            {
+            // InternalGridSource.g:6362:2: ( ruleEQFilter )
+            // InternalGridSource.g:6363:3: ruleEQFilter
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_4_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleEQFilter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Input__FiltersAssignment_4_1"
+
+
+    // $ANTLR start "rule__EQFilter__RootTypePropertyPathAssignment_2"
+    // InternalGridSource.g:6372:1: rule__EQFilter__RootTypePropertyPathAssignment_2 : ( ruleNestedField ) ;
+    public final void rule__EQFilter__RootTypePropertyPathAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6376:1: ( ( ruleNestedField ) )
+            // InternalGridSource.g:6377:2: ( ruleNestedField )
+            {
+            // InternalGridSource.g:6377:2: ( ruleNestedField )
+            // InternalGridSource.g:6378:3: ruleNestedField
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getRootTypePropertyPathNestedFieldParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleNestedField();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEQFilterAccess().getRootTypePropertyPathNestedFieldParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EQFilter__RootTypePropertyPathAssignment_2"
+
+
+    // $ANTLR start "rule__EQFilter__InputTypePropertyPathAssignment_5"
+    // InternalGridSource.g:6387:1: rule__EQFilter__InputTypePropertyPathAssignment_5 : ( ruleNestedField ) ;
+    public final void rule__EQFilter__InputTypePropertyPathAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6391:1: ( ( ruleNestedField ) )
+            // InternalGridSource.g:6392:2: ( ruleNestedField )
+            {
+            // InternalGridSource.g:6392:2: ( ruleNestedField )
+            // InternalGridSource.g:6393:3: ruleNestedField
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getInputTypePropertyPathNestedFieldParserRuleCall_5_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleNestedField();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEQFilterAccess().getInputTypePropertyPathNestedFieldParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__EQFilter__InputTypePropertyPathAssignment_5"
+
+
+    // $ANTLR start "rule__Property__PathAssignment_1"
+    // InternalGridSource.g:6402:1: rule__Property__PathAssignment_1 : ( ruleNestedField ) ;
+    public final void rule__Property__PathAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6406:1: ( ( ruleNestedField ) )
+            // InternalGridSource.g:6407:2: ( ruleNestedField )
+            {
+            // InternalGridSource.g:6407:2: ( ruleNestedField )
+            // InternalGridSource.g:6408:3: ruleNestedField
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyAccess().getPathNestedFieldParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleNestedField();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyAccess().getPathNestedFieldParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Property__PathAssignment_1"
+
+
+    // $ANTLR start "rule__Property__StyleAssignment_3"
+    // InternalGridSource.g:6417:1: rule__Property__StyleAssignment_3 : ( rulePropertyStyle ) ;
+    public final void rule__Property__StyleAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6421:1: ( ( rulePropertyStyle ) )
+            // InternalGridSource.g:6422:2: ( rulePropertyStyle )
+            {
+            // InternalGridSource.g:6422:2: ( rulePropertyStyle )
+            // InternalGridSource.g:6423:3: rulePropertyStyle
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyAccess().getStylePropertyStyleParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            rulePropertyStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyAccess().getStylePropertyStyleParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__Property__StyleAssignment_3"
+
+
+    // $ANTLR start "rule__NestedField__FieldAssignment_1"
+    // InternalGridSource.g:6432:1: rule__NestedField__FieldAssignment_1 : ( ( RULE_ID ) ) ;
+    public final void rule__NestedField__FieldAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6436:1: ( ( ( RULE_ID ) ) )
+            // InternalGridSource.g:6437:2: ( ( RULE_ID ) )
+            {
+            // InternalGridSource.g:6437:2: ( ( RULE_ID ) )
+            // InternalGridSource.g:6438:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedFieldAccess().getFieldJvmOperationCrossReference_1_0()); 
+            }
+            // InternalGridSource.g:6439:3: ( RULE_ID )
+            // InternalGridSource.g:6440:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedFieldAccess().getFieldJvmOperationIDTerminalRuleCall_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedFieldAccess().getFieldJvmOperationIDTerminalRuleCall_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedFieldAccess().getFieldJvmOperationCrossReference_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedField__FieldAssignment_1"
+
+
+    // $ANTLR start "rule__NestedField__PathAssignment_2"
+    // InternalGridSource.g:6451:1: rule__NestedField__PathAssignment_2 : ( ruleNestedPath ) ;
+    public final void rule__NestedField__PathAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6455:1: ( ( ruleNestedPath ) )
+            // InternalGridSource.g:6456:2: ( ruleNestedPath )
+            {
+            // InternalGridSource.g:6456:2: ( ruleNestedPath )
+            // InternalGridSource.g:6457:3: ruleNestedPath
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedFieldAccess().getPathNestedPathParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleNestedPath();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedFieldAccess().getPathNestedPathParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedField__PathAssignment_2"
+
+
+    // $ANTLR start "rule__NestedPath__FieldAssignment_2"
+    // InternalGridSource.g:6466:1: rule__NestedPath__FieldAssignment_2 : ( ( RULE_ID ) ) ;
+    public final void rule__NestedPath__FieldAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6470:1: ( ( ( RULE_ID ) ) )
+            // InternalGridSource.g:6471:2: ( ( RULE_ID ) )
+            {
+            // InternalGridSource.g:6471:2: ( ( RULE_ID ) )
+            // InternalGridSource.g:6472:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathAccess().getFieldJvmOperationCrossReference_2_0()); 
+            }
+            // InternalGridSource.g:6473:3: ( RULE_ID )
+            // InternalGridSource.g:6474:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathAccess().getFieldJvmOperationIDTerminalRuleCall_2_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedPathAccess().getFieldJvmOperationIDTerminalRuleCall_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedPathAccess().getFieldJvmOperationCrossReference_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedPath__FieldAssignment_2"
+
+
+    // $ANTLR start "rule__NestedPath__PathAssignment_3"
+    // InternalGridSource.g:6485:1: rule__NestedPath__PathAssignment_3 : ( ruleNestedPath ) ;
+    public final void rule__NestedPath__PathAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6489:1: ( ( ruleNestedPath ) )
+            // InternalGridSource.g:6490:2: ( ruleNestedPath )
+            {
+            // InternalGridSource.g:6490:2: ( ruleNestedPath )
+            // InternalGridSource.g:6491:3: ruleNestedPath
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathAccess().getPathNestedPathParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleNestedPath();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedPathAccess().getPathNestedPathParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NestedPath__PathAssignment_3"
+
+
+    // $ANTLR start "rule__PropertyButtonStyle__EventTopicAssignment_3"
+    // InternalGridSource.g:6500:1: rule__PropertyButtonStyle__EventTopicAssignment_3 : ( RULE_STRING ) ;
+    public final void rule__PropertyButtonStyle__EventTopicAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6504:1: ( ( RULE_STRING ) )
+            // InternalGridSource.g:6505:2: ( RULE_STRING )
+            {
+            // InternalGridSource.g:6505:2: ( RULE_STRING )
+            // InternalGridSource.g:6506:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyButtonStyleAccess().getEventTopicSTRINGTerminalRuleCall_3_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyButtonStyleAccess().getEventTopicSTRINGTerminalRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyButtonStyle__EventTopicAssignment_3"
+
+
+    // $ANTLR start "rule__PropertyDateStyle__DateFormatAssignment_3"
+    // InternalGridSource.g:6515:1: rule__PropertyDateStyle__DateFormatAssignment_3 : ( RULE_STRING ) ;
+    public final void rule__PropertyDateStyle__DateFormatAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6519:1: ( ( RULE_STRING ) )
+            // InternalGridSource.g:6520:2: ( RULE_STRING )
+            {
+            // InternalGridSource.g:6520:2: ( RULE_STRING )
+            // InternalGridSource.g:6521:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyDateStyleAccess().getDateFormatSTRINGTerminalRuleCall_3_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyDateStyleAccess().getDateFormatSTRINGTerminalRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyDateStyle__DateFormatAssignment_3"
+
+
+    // $ANTLR start "rule__PropertyNumberStyle__NumberFormatAssignment_3"
+    // InternalGridSource.g:6530:1: rule__PropertyNumberStyle__NumberFormatAssignment_3 : ( RULE_STRING ) ;
+    public final void rule__PropertyNumberStyle__NumberFormatAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6534:1: ( ( RULE_STRING ) )
+            // InternalGridSource.g:6535:2: ( RULE_STRING )
+            {
+            // InternalGridSource.g:6535:2: ( RULE_STRING )
+            // InternalGridSource.g:6536:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatSTRINGTerminalRuleCall_3_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatSTRINGTerminalRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyNumberStyle__NumberFormatAssignment_3"
+
+
+    // $ANTLR start "rule__PropertyProgressbarStyle__MaxValueAssignment_3"
+    // InternalGridSource.g:6545:1: rule__PropertyProgressbarStyle__MaxValueAssignment_3 : ( ruleLDouble ) ;
+    public final void rule__PropertyProgressbarStyle__MaxValueAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6549:1: ( ( ruleLDouble ) )
+            // InternalGridSource.g:6550:2: ( ruleLDouble )
+            {
+            // InternalGridSource.g:6550:2: ( ruleLDouble )
+            // InternalGridSource.g:6551:3: ruleLDouble
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueLDoubleParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleLDouble();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueLDoubleParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyProgressbarStyle__MaxValueAssignment_3"
+
+
+    // $ANTLR start "rule__GridPropIndicatorStyle__GreenStartsAssignment_3"
+    // InternalGridSource.g:6560:1: rule__GridPropIndicatorStyle__GreenStartsAssignment_3 : ( ruleLDouble ) ;
+    public final void rule__GridPropIndicatorStyle__GreenStartsAssignment_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6564:1: ( ( ruleLDouble ) )
+            // InternalGridSource.g:6565:2: ( ruleLDouble )
+            {
+            // InternalGridSource.g:6565:2: ( ruleLDouble )
+            // InternalGridSource.g:6566:3: ruleLDouble
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsLDoubleParserRuleCall_3_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleLDouble();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsLDoubleParserRuleCall_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GridPropIndicatorStyle__GreenStartsAssignment_3"
+
+
+    // $ANTLR start "rule__GridPropIndicatorStyle__RedEndsAssignment_5"
+    // InternalGridSource.g:6575:1: rule__GridPropIndicatorStyle__RedEndsAssignment_5 : ( ruleLDouble ) ;
+    public final void rule__GridPropIndicatorStyle__RedEndsAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6579:1: ( ( ruleLDouble ) )
+            // InternalGridSource.g:6580:2: ( ruleLDouble )
+            {
+            // InternalGridSource.g:6580:2: ( ruleLDouble )
+            // InternalGridSource.g:6581:3: ruleLDouble
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsLDoubleParserRuleCall_5_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleLDouble();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsLDoubleParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__GridPropIndicatorStyle__RedEndsAssignment_5"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__HtmlPatternAssignment_2"
+    // InternalGridSource.g:6590:1: rule__PropertyQuantityStyle__HtmlPatternAssignment_2 : ( RULE_STRING ) ;
+    public final void rule__PropertyQuantityStyle__HtmlPatternAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6594:1: ( ( RULE_STRING ) )
+            // InternalGridSource.g:6595:2: ( RULE_STRING )
+            {
+            // InternalGridSource.g:6595:2: ( RULE_STRING )
+            // InternalGridSource.g:6596:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__HtmlPatternAssignment_2"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5"
+    // InternalGridSource.g:6605:1: rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5 : ( ruleNestedField ) ;
+    public final void rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6609:1: ( ( ruleNestedField ) )
+            // InternalGridSource.g:6610:2: ( ruleNestedField )
+            {
+            // InternalGridSource.g:6610:2: ( ruleNestedField )
+            // InternalGridSource.g:6611:3: ruleNestedField
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleNestedField();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__ValuePropertyPathAssignment_5"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2"
+    // InternalGridSource.g:6620:1: rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2 : ( RULE_STRING ) ;
+    public final void rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6624:1: ( ( RULE_STRING ) )
+            // InternalGridSource.g:6625:2: ( RULE_STRING )
+            {
+            // InternalGridSource.g:6625:2: ( RULE_STRING )
+            // InternalGridSource.g:6626:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__ValueNumberFormatAssignment_6_2"
+
+
+    // $ANTLR start "rule__PropertyQuantityStyle__UomPropertyPathAssignment_9"
+    // InternalGridSource.g:6635:1: rule__PropertyQuantityStyle__UomPropertyPathAssignment_9 : ( ruleNestedField ) ;
+    public final void rule__PropertyQuantityStyle__UomPropertyPathAssignment_9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6639:1: ( ( ruleNestedField ) )
+            // InternalGridSource.g:6640:2: ( ruleNestedField )
+            {
+            // InternalGridSource.g:6640:2: ( ruleNestedField )
+            // InternalGridSource.g:6641:3: ruleNestedField
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathNestedFieldParserRuleCall_9_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleNestedField();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathNestedFieldParserRuleCall_9_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyQuantityStyle__UomPropertyPathAssignment_9"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__HtmlPatternAssignment_2"
+    // InternalGridSource.g:6650:1: rule__PropertyPriceStyle__HtmlPatternAssignment_2 : ( RULE_STRING ) ;
+    public final void rule__PropertyPriceStyle__HtmlPatternAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6654:1: ( ( RULE_STRING ) )
+            // InternalGridSource.g:6655:2: ( RULE_STRING )
+            {
+            // InternalGridSource.g:6655:2: ( RULE_STRING )
+            // InternalGridSource.g:6656:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__HtmlPatternAssignment_2"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__ValuePropertyPathAssignment_5"
+    // InternalGridSource.g:6665:1: rule__PropertyPriceStyle__ValuePropertyPathAssignment_5 : ( ruleNestedField ) ;
+    public final void rule__PropertyPriceStyle__ValuePropertyPathAssignment_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6669:1: ( ( ruleNestedField ) )
+            // InternalGridSource.g:6670:2: ( ruleNestedField )
+            {
+            // InternalGridSource.g:6670:2: ( ruleNestedField )
+            // InternalGridSource.g:6671:3: ruleNestedField
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleNestedField();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__ValuePropertyPathAssignment_5"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2"
+    // InternalGridSource.g:6680:1: rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2 : ( RULE_STRING ) ;
+    public final void rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6684:1: ( ( RULE_STRING ) )
+            // InternalGridSource.g:6685:2: ( RULE_STRING )
+            {
+            // InternalGridSource.g:6685:2: ( RULE_STRING )
+            // InternalGridSource.g:6686:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__ValueNumberFormatAssignment_6_2"
+
+
+    // $ANTLR start "rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9"
+    // InternalGridSource.g:6695:1: rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9 : ( ruleNestedField ) ;
+    public final void rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6699:1: ( ( ruleNestedField ) )
+            // InternalGridSource.g:6700:2: ( ruleNestedField )
+            {
+            // InternalGridSource.g:6700:2: ( ruleNestedField )
+            // InternalGridSource.g:6701:3: ruleNestedField
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathNestedFieldParserRuleCall_9_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleNestedField();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathNestedFieldParserRuleCall_9_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyPriceStyle__CurrencyPropertyPathAssignment_9"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__EventTopicAssignment_2_1"
+    // InternalGridSource.g:6710:1: rule__PropertyImageStyle__EventTopicAssignment_2_1 : ( RULE_STRING ) ;
+    public final void rule__PropertyImageStyle__EventTopicAssignment_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6714:1: ( ( RULE_STRING ) )
+            // InternalGridSource.g:6715:2: ( RULE_STRING )
+            {
+            // InternalGridSource.g:6715:2: ( RULE_STRING )
+            // InternalGridSource.g:6716:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyImageStyleAccess().getEventTopicSTRINGTerminalRuleCall_2_1_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyImageStyleAccess().getEventTopicSTRINGTerminalRuleCall_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__EventTopicAssignment_2_1"
+
+
+    // $ANTLR start "rule__PropertyImageStyle__ConfigsAssignment_4"
+    // InternalGridSource.g:6725:1: rule__PropertyImageStyle__ConfigsAssignment_4 : ( ruleStyleConfig ) ;
+    public final void rule__PropertyImageStyle__ConfigsAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6729:1: ( ( ruleStyleConfig ) )
+            // InternalGridSource.g:6730:2: ( ruleStyleConfig )
+            {
+            // InternalGridSource.g:6730:2: ( ruleStyleConfig )
+            // InternalGridSource.g:6731:3: ruleStyleConfig
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyImageStyleAccess().getConfigsStyleConfigParserRuleCall_4_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleStyleConfig();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyImageStyleAccess().getConfigsStyleConfigParserRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__PropertyImageStyle__ConfigsAssignment_4"
+
+
+    // $ANTLR start "rule__NumericToResourceStyleConfig__CompareAssignment_1"
+    // InternalGridSource.g:6740:1: rule__NumericToResourceStyleConfig__CompareAssignment_1 : ( ruleStyleCompare ) ;
+    public final void rule__NumericToResourceStyleConfig__CompareAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6744:1: ( ( ruleStyleCompare ) )
+            // InternalGridSource.g:6745:2: ( ruleStyleCompare )
+            {
+            // InternalGridSource.g:6745:2: ( ruleStyleCompare )
+            // InternalGridSource.g:6746:3: ruleStyleCompare
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleStyleCompare();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NumericToResourceStyleConfig__CompareAssignment_1"
+
+
+    // $ANTLR start "rule__NumericToResourceStyleConfig__ValueAssignment_2"
+    // InternalGridSource.g:6755:1: rule__NumericToResourceStyleConfig__ValueAssignment_2 : ( ruleLDouble ) ;
+    public final void rule__NumericToResourceStyleConfig__ValueAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6759:1: ( ( ruleLDouble ) )
+            // InternalGridSource.g:6760:2: ( ruleLDouble )
+            {
+            // InternalGridSource.g:6760:2: ( ruleLDouble )
+            // InternalGridSource.g:6761:3: ruleLDouble
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumericToResourceStyleConfigAccess().getValueLDoubleParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleLDouble();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumericToResourceStyleConfigAccess().getValueLDoubleParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NumericToResourceStyleConfig__ValueAssignment_2"
+
+
+    // $ANTLR start "rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4"
+    // InternalGridSource.g:6770:1: rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4 : ( RULE_THEME_RESOURCE ) ;
+    public final void rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6774:1: ( ( RULE_THEME_RESOURCE ) )
+            // InternalGridSource.g:6775:2: ( RULE_THEME_RESOURCE )
+            {
+            // InternalGridSource.g:6775:2: ( RULE_THEME_RESOURCE )
+            // InternalGridSource.g:6776:3: RULE_THEME_RESOURCE
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0()); 
+            }
+            match(input,RULE_THEME_RESOURCE,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__NumericToResourceStyleConfig__ResourceThemePathAssignment_4"
+
+
+    // $ANTLR start "rule__StringToResourceStyleConfig__CompareAssignment_1"
+    // InternalGridSource.g:6785:1: rule__StringToResourceStyleConfig__CompareAssignment_1 : ( ruleStyleCompare ) ;
+    public final void rule__StringToResourceStyleConfig__CompareAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6789:1: ( ( ruleStyleCompare ) )
+            // InternalGridSource.g:6790:2: ( ruleStyleCompare )
+            {
+            // InternalGridSource.g:6790:2: ( ruleStyleCompare )
+            // InternalGridSource.g:6791:3: ruleStyleCompare
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStringToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleStyleCompare();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStringToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StringToResourceStyleConfig__CompareAssignment_1"
+
+
+    // $ANTLR start "rule__StringToResourceStyleConfig__ValueAssignment_2"
+    // InternalGridSource.g:6800:1: rule__StringToResourceStyleConfig__ValueAssignment_2 : ( RULE_STRING ) ;
+    public final void rule__StringToResourceStyleConfig__ValueAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6804:1: ( ( RULE_STRING ) )
+            // InternalGridSource.g:6805:2: ( RULE_STRING )
+            {
+            // InternalGridSource.g:6805:2: ( RULE_STRING )
+            // InternalGridSource.g:6806:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStringToResourceStyleConfigAccess().getValueSTRINGTerminalRuleCall_2_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStringToResourceStyleConfigAccess().getValueSTRINGTerminalRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StringToResourceStyleConfig__ValueAssignment_2"
+
+
+    // $ANTLR start "rule__StringToResourceStyleConfig__ResourceThemePathAssignment_4"
+    // InternalGridSource.g:6815:1: rule__StringToResourceStyleConfig__ResourceThemePathAssignment_4 : ( RULE_THEME_RESOURCE ) ;
+    public final void rule__StringToResourceStyleConfig__ResourceThemePathAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6819:1: ( ( RULE_THEME_RESOURCE ) )
+            // InternalGridSource.g:6820:2: ( RULE_THEME_RESOURCE )
+            {
+            // InternalGridSource.g:6820:2: ( RULE_THEME_RESOURCE )
+            // InternalGridSource.g:6821:3: RULE_THEME_RESOURCE
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0()); 
+            }
+            match(input,RULE_THEME_RESOURCE,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__StringToResourceStyleConfig__ResourceThemePathAssignment_4"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0"
+    // InternalGridSource.g:6830:1: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 : ( ruleJvmTypeReference ) ;
+    public final void rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6834:1: ( ( ruleJvmTypeReference ) )
+            // InternalGridSource.g:6835:2: ( ruleJvmTypeReference )
+            {
+            // InternalGridSource.g:6835:2: ( ruleJvmTypeReference )
+            // InternalGridSource.g:6836:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1"
+    // InternalGridSource.g:6845:1: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 : ( ruleJvmTypeReference ) ;
+    public final void rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6849:1: ( ( ruleJvmTypeReference ) )
+            // InternalGridSource.g:6850:2: ( ruleJvmTypeReference )
+            {
+            // InternalGridSource.g:6850:2: ( ruleJvmTypeReference )
+            // InternalGridSource.g:6851:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1"
+
+
+    // $ANTLR start "rule__XFunctionTypeRef__ReturnTypeAssignment_2"
+    // InternalGridSource.g:6860:1: rule__XFunctionTypeRef__ReturnTypeAssignment_2 : ( ruleJvmTypeReference ) ;
+    public final void rule__XFunctionTypeRef__ReturnTypeAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6864:1: ( ( ruleJvmTypeReference ) )
+            // InternalGridSource.g:6865:2: ( ruleJvmTypeReference )
+            {
+            // InternalGridSource.g:6865:2: ( ruleJvmTypeReference )
+            // InternalGridSource.g:6866:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XFunctionTypeRef__ReturnTypeAssignment_2"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__TypeAssignment_0"
+    // InternalGridSource.g:6875:1: rule__JvmParameterizedTypeReference__TypeAssignment_0 : ( ( ruleQualifiedName ) ) ;
+    public final void rule__JvmParameterizedTypeReference__TypeAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6879:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalGridSource.g:6880:2: ( ( ruleQualifiedName ) )
+            {
+            // InternalGridSource.g:6880:2: ( ( ruleQualifiedName ) )
+            // InternalGridSource.g:6881:3: ( ruleQualifiedName )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0()); 
+            }
+            // InternalGridSource.g:6882:3: ( ruleQualifiedName )
+            // InternalGridSource.g:6883:4: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeQualifiedNameParserRuleCall_0_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeQualifiedNameParserRuleCall_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__TypeAssignment_0"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1"
+    // InternalGridSource.g:6894:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 : ( ruleJvmArgumentTypeReference ) ;
+    public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6898:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalGridSource.g:6899:2: ( ruleJvmArgumentTypeReference )
+            {
+            // InternalGridSource.g:6899:2: ( ruleJvmArgumentTypeReference )
+            // InternalGridSource.g:6900:3: ruleJvmArgumentTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1"
+    // InternalGridSource.g:6909:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6913:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalGridSource.g:6914:2: ( ruleJvmArgumentTypeReference )
+            {
+            // InternalGridSource.g:6914:2: ( ruleJvmArgumentTypeReference )
+            // InternalGridSource.g:6915:3: ruleJvmArgumentTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1"
+    // InternalGridSource.g:6924:1: rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 : ( ( ruleValidID ) ) ;
+    public final void rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6928:1: ( ( ( ruleValidID ) ) )
+            // InternalGridSource.g:6929:2: ( ( ruleValidID ) )
+            {
+            // InternalGridSource.g:6929:2: ( ( ruleValidID ) )
+            // InternalGridSource.g:6930:3: ( ruleValidID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0()); 
+            }
+            // InternalGridSource.g:6931:3: ( ruleValidID )
+            // InternalGridSource.g:6932:4: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeValidIDParserRuleCall_1_4_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeValidIDParserRuleCall_1_4_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1"
+    // InternalGridSource.g:6943:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6947:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalGridSource.g:6948:2: ( ruleJvmArgumentTypeReference )
+            {
+            // InternalGridSource.g:6948:2: ( ruleJvmArgumentTypeReference )
+            // InternalGridSource.g:6949:3: ruleJvmArgumentTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1"
+
+
+    // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1"
+    // InternalGridSource.g:6958:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6962:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalGridSource.g:6963:2: ( ruleJvmArgumentTypeReference )
+            {
+            // InternalGridSource.g:6963:2: ( ruleJvmArgumentTypeReference )
+            // InternalGridSource.g:6964:3: ruleJvmArgumentTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0"
+    // InternalGridSource.g:6973:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 : ( ruleJvmUpperBound ) ;
+    public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6977:1: ( ( ruleJvmUpperBound ) )
+            // InternalGridSource.g:6978:2: ( ruleJvmUpperBound )
+            {
+            // InternalGridSource.g:6978:2: ( ruleJvmUpperBound )
+            // InternalGridSource.g:6979:3: ruleJvmUpperBound
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmUpperBound();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1"
+    // InternalGridSource.g:6988:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 : ( ruleJvmUpperBoundAnded ) ;
+    public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:6992:1: ( ( ruleJvmUpperBoundAnded ) )
+            // InternalGridSource.g:6993:2: ( ruleJvmUpperBoundAnded )
+            {
+            // InternalGridSource.g:6993:2: ( ruleJvmUpperBoundAnded )
+            // InternalGridSource.g:6994:3: ruleJvmUpperBoundAnded
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmUpperBoundAnded();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0"
+    // InternalGridSource.g:7003:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 : ( ruleJvmLowerBound ) ;
+    public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:7007:1: ( ( ruleJvmLowerBound ) )
+            // InternalGridSource.g:7008:2: ( ruleJvmLowerBound )
+            {
+            // InternalGridSource.g:7008:2: ( ruleJvmLowerBound )
+            // InternalGridSource.g:7009:3: ruleJvmLowerBound
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmLowerBound();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0"
+
+
+    // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1"
+    // InternalGridSource.g:7018:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 : ( ruleJvmLowerBoundAnded ) ;
+    public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:7022:1: ( ( ruleJvmLowerBoundAnded ) )
+            // InternalGridSource.g:7023:2: ( ruleJvmLowerBoundAnded )
+            {
+            // InternalGridSource.g:7023:2: ( ruleJvmLowerBoundAnded )
+            // InternalGridSource.g:7024:3: ruleJvmLowerBoundAnded
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmLowerBoundAnded();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1"
+
+
+    // $ANTLR start "rule__JvmUpperBound__TypeReferenceAssignment_1"
+    // InternalGridSource.g:7033:1: rule__JvmUpperBound__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    public final void rule__JvmUpperBound__TypeReferenceAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:7037:1: ( ( ruleJvmTypeReference ) )
+            // InternalGridSource.g:7038:2: ( ruleJvmTypeReference )
+            {
+            // InternalGridSource.g:7038:2: ( ruleJvmTypeReference )
+            // InternalGridSource.g:7039:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBound__TypeReferenceAssignment_1"
+
+
+    // $ANTLR start "rule__JvmUpperBoundAnded__TypeReferenceAssignment_1"
+    // InternalGridSource.g:7048:1: rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    public final void rule__JvmUpperBoundAnded__TypeReferenceAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:7052:1: ( ( ruleJvmTypeReference ) )
+            // InternalGridSource.g:7053:2: ( ruleJvmTypeReference )
+            {
+            // InternalGridSource.g:7053:2: ( ruleJvmTypeReference )
+            // InternalGridSource.g:7054:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmUpperBoundAnded__TypeReferenceAssignment_1"
+
+
+    // $ANTLR start "rule__JvmLowerBound__TypeReferenceAssignment_1"
+    // InternalGridSource.g:7063:1: rule__JvmLowerBound__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    public final void rule__JvmLowerBound__TypeReferenceAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:7067:1: ( ( ruleJvmTypeReference ) )
+            // InternalGridSource.g:7068:2: ( ruleJvmTypeReference )
+            {
+            // InternalGridSource.g:7068:2: ( ruleJvmTypeReference )
+            // InternalGridSource.g:7069:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBound__TypeReferenceAssignment_1"
+
+
+    // $ANTLR start "rule__JvmLowerBoundAnded__TypeReferenceAssignment_1"
+    // InternalGridSource.g:7078:1: rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    public final void rule__JvmLowerBoundAnded__TypeReferenceAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:7082:1: ( ( ruleJvmTypeReference ) )
+            // InternalGridSource.g:7083:2: ( ruleJvmTypeReference )
+            {
+            // InternalGridSource.g:7083:2: ( ruleJvmTypeReference )
+            // InternalGridSource.g:7084:3: ruleJvmTypeReference
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__JvmLowerBoundAnded__TypeReferenceAssignment_1"
+
+
+    // $ANTLR start "rule__XImportDeclaration__StaticAssignment_1_0_0"
+    // InternalGridSource.g:7093:1: rule__XImportDeclaration__StaticAssignment_1_0_0 : ( ( 'static' ) ) ;
+    public final void rule__XImportDeclaration__StaticAssignment_1_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:7097:1: ( ( ( 'static' ) ) )
+            // InternalGridSource.g:7098:2: ( ( 'static' ) )
+            {
+            // InternalGridSource.g:7098:2: ( ( 'static' ) )
+            // InternalGridSource.g:7099:3: ( 'static' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_1_0_0_0()); 
+            }
+            // InternalGridSource.g:7100:3: ( 'static' )
+            // InternalGridSource.g:7101:4: 'static'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_1_0_0_0()); 
+            }
+            match(input,72,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_1_0_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_1_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__StaticAssignment_1_0_0"
+
+
+    // $ANTLR start "rule__XImportDeclaration__ExtensionAssignment_1_0_1"
+    // InternalGridSource.g:7112:1: rule__XImportDeclaration__ExtensionAssignment_1_0_1 : ( ( 'extension' ) ) ;
+    public final void rule__XImportDeclaration__ExtensionAssignment_1_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:7116:1: ( ( ( 'extension' ) ) )
+            // InternalGridSource.g:7117:2: ( ( 'extension' ) )
+            {
+            // InternalGridSource.g:7117:2: ( ( 'extension' ) )
+            // InternalGridSource.g:7118:3: ( 'extension' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_1_0_1_0()); 
+            }
+            // InternalGridSource.g:7119:3: ( 'extension' )
+            // InternalGridSource.g:7120:4: 'extension'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_1_0_1_0()); 
+            }
+            match(input,73,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_1_0_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_1_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__ExtensionAssignment_1_0_1"
+
+
+    // $ANTLR start "rule__XImportDeclaration__ImportedTypeAssignment_1_0_2"
+    // InternalGridSource.g:7131:1: rule__XImportDeclaration__ImportedTypeAssignment_1_0_2 : ( ( ruleQualifiedNameInStaticImport ) ) ;
+    public final void rule__XImportDeclaration__ImportedTypeAssignment_1_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:7135:1: ( ( ( ruleQualifiedNameInStaticImport ) ) )
+            // InternalGridSource.g:7136:2: ( ( ruleQualifiedNameInStaticImport ) )
+            {
+            // InternalGridSource.g:7136:2: ( ( ruleQualifiedNameInStaticImport ) )
+            // InternalGridSource.g:7137:3: ( ruleQualifiedNameInStaticImport )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_0_2_0()); 
+            }
+            // InternalGridSource.g:7138:3: ( ruleQualifiedNameInStaticImport )
+            // InternalGridSource.g:7139:4: ruleQualifiedNameInStaticImport
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameInStaticImportParserRuleCall_1_0_2_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedNameInStaticImport();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameInStaticImportParserRuleCall_1_0_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__ImportedTypeAssignment_1_0_2"
+
+
+    // $ANTLR start "rule__XImportDeclaration__WildcardAssignment_1_0_3_0"
+    // InternalGridSource.g:7150:1: rule__XImportDeclaration__WildcardAssignment_1_0_3_0 : ( ( '*' ) ) ;
+    public final void rule__XImportDeclaration__WildcardAssignment_1_0_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:7154:1: ( ( ( '*' ) ) )
+            // InternalGridSource.g:7155:2: ( ( '*' ) )
+            {
+            // InternalGridSource.g:7155:2: ( ( '*' ) )
+            // InternalGridSource.g:7156:3: ( '*' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_1_0_3_0_0()); 
+            }
+            // InternalGridSource.g:7157:3: ( '*' )
+            // InternalGridSource.g:7158:4: '*'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_1_0_3_0_0()); 
+            }
+            match(input,69,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_1_0_3_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_1_0_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__WildcardAssignment_1_0_3_0"
+
+
+    // $ANTLR start "rule__XImportDeclaration__MemberNameAssignment_1_0_3_1"
+    // InternalGridSource.g:7169:1: rule__XImportDeclaration__MemberNameAssignment_1_0_3_1 : ( ruleValidID ) ;
+    public final void rule__XImportDeclaration__MemberNameAssignment_1_0_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:7173:1: ( ( ruleValidID ) )
+            // InternalGridSource.g:7174:2: ( ruleValidID )
+            {
+            // InternalGridSource.g:7174:2: ( ruleValidID )
+            // InternalGridSource.g:7175:3: ruleValidID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_1_0_3_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_1_0_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__MemberNameAssignment_1_0_3_1"
+
+
+    // $ANTLR start "rule__XImportDeclaration__ImportedTypeAssignment_1_1"
+    // InternalGridSource.g:7184:1: rule__XImportDeclaration__ImportedTypeAssignment_1_1 : ( ( ruleQualifiedName ) ) ;
+    public final void rule__XImportDeclaration__ImportedTypeAssignment_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:7188:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalGridSource.g:7189:2: ( ( ruleQualifiedName ) )
+            {
+            // InternalGridSource.g:7189:2: ( ( ruleQualifiedName ) )
+            // InternalGridSource.g:7190:3: ( ruleQualifiedName )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_1_0()); 
+            }
+            // InternalGridSource.g:7191:3: ( ruleQualifiedName )
+            // InternalGridSource.g:7192:4: ruleQualifiedName
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameParserRuleCall_1_1_0_1()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameParserRuleCall_1_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__ImportedTypeAssignment_1_1"
+
+
+    // $ANTLR start "rule__XImportDeclaration__ImportedNamespaceAssignment_1_2"
+    // InternalGridSource.g:7203:1: rule__XImportDeclaration__ImportedNamespaceAssignment_1_2 : ( ruleQualifiedNameWithWildcard ) ;
+    public final void rule__XImportDeclaration__ImportedNamespaceAssignment_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalGridSource.g:7207:1: ( ( ruleQualifiedNameWithWildcard ) )
+            // InternalGridSource.g:7208:2: ( ruleQualifiedNameWithWildcard )
+            {
+            // InternalGridSource.g:7208:2: ( ruleQualifiedNameWithWildcard )
+            // InternalGridSource.g:7209:3: ruleQualifiedNameWithWildcard
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleQualifiedNameWithWildcard();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__XImportDeclaration__ImportedNamespaceAssignment_1_2"
+
+    // Delegated rules
+
+
+    protected DFA8 dfa8 = new DFA8(this);
+    static final String dfa_1s = "\7\uffff";
+    static final String dfa_2s = "\2\uffff\1\4\3\uffff\1\4";
+    static final String dfa_3s = "\1\4\1\uffff\1\42\1\4\2\uffff\1\42";
+    static final String dfa_4s = "\1\110\1\uffff\1\107\1\105\2\uffff\1\107";
+    static final String dfa_5s = "\1\uffff\1\1\2\uffff\1\2\1\3\1\uffff";
+    static final String dfa_6s = "\7\uffff}>";
+    static final String[] dfa_7s = {
+            "\1\2\103\uffff\1\1",
+            "",
+            "\1\3\44\uffff\1\4",
+            "\1\6\100\uffff\1\5",
+            "",
+            "",
+            "\1\3\44\uffff\1\4"
+    };
+
+    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 DFA8 extends DFA {
+
+        public DFA8(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 8;
+            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 "1206:1: rule__XImportDeclaration__Alternatives_1 : ( ( ( rule__XImportDeclaration__Group_1_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_1_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_1_2 ) ) );";
+        }
+    }
+ 
+
+    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[]{0x0000000000000012L});
+    public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000000000000010L});
+    public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000000400000L});
+    public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x2004000000000010L});
+    public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000800000L});
+    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000001000000L});
+    public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000006000000L});
+    public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000004000002L});
+    public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000102000000L});
+    public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000100000002L});
+    public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000008000000L});
+    public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000020000000L});
+    public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000010000000L});
+    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000010000002L});
+    public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000040000000L});
+    public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000080000000L});
+    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000200000000L});
+    public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x00D096E800000000L});
+    public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000000400000000L});
+    public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000800000000L});
+    public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000001000000000L});
+    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000000000040L});
+    public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000002000000000L});
+    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000004000000000L});
+    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000008000000000L});
+    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000010000000000L});
+    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000020000000000L});
+    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000040000000000L});
+    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000080000000000L});
+    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000000006020L});
+    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000200000000000L});
+    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000400000000000L});
+    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000800000000000L});
+    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0001000000000040L});
+    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0006000000000000L});
+    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0008000000000000L});
+    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0010000000000000L});
+    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0024000000000000L});
+    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0040000000000000L});
+    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0080000000000000L});
+    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000001000800000L});
+    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0500000002000000L});
+    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0500000000000002L});
+    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0000000400000002L});
+    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x00000000001F8000L});
+    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0200000000000000L});
+    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0000000000000080L});
+    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0800000000000000L});
+    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0800000000000002L});
+    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x1000000000000000L});
+    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x200C000000000010L});
+    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x4000000000000000L});
+    public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x4000000000000002L});
+    public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x8000000000000000L});
+    public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x2004000000000010L,0x0000000000000002L});
+    public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x4000000000000000L,0x0000000000000001L});
+    public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000014L});
+    public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000008L});
+    public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000008L});
+    public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000020L});
+    public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000100L});
+    public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000080L});
+    public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000200L});
+    public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000020L});
+
+}
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/src/org/eclipse/osbp/xtext/gridsource/ide/GridSourceIdeModule.java b/org.eclipse.osbp.xtext.gridsource.ide/src/org/eclipse/osbp/xtext/gridsource/ide/GridSourceIdeModule.java
new file mode 100644
index 0000000..89f280c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/src/org/eclipse/osbp/xtext/gridsource/ide/GridSourceIdeModule.java
@@ -0,0 +1,11 @@
+/*
+ * generated by Xtext 2.11.0
+ */
+package org.eclipse.osbp.xtext.gridsource.ide;
+
+
+/**
+ * Use this class to register ide components.
+ */
+public class GridSourceIdeModule extends AbstractGridSourceIdeModule {
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ide/src/org/eclipse/osbp/xtext/gridsource/ide/GridSourceIdeSetup.java b/org.eclipse.osbp.xtext.gridsource.ide/src/org/eclipse/osbp/xtext/gridsource/ide/GridSourceIdeSetup.java
new file mode 100644
index 0000000..d66f249
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ide/src/org/eclipse/osbp/xtext/gridsource/ide/GridSourceIdeSetup.java
@@ -0,0 +1,22 @@
+/*
+ * generated by Xtext 2.11.0
+ */
+package org.eclipse.osbp.xtext.gridsource.ide;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.osbp.xtext.gridsource.GridSourceRuntimeModule;
+import org.eclipse.osbp.xtext.gridsource.GridSourceStandaloneSetup;
+import org.eclipse.xtext.util.Modules2;
+
+/**
+ * Initialization support for running Xtext languages as language servers.
+ */
+public class GridSourceIdeSetup extends GridSourceStandaloneSetup {
+
+	@Override
+	public Injector createInjector() {
+		return Guice.createInjector(Modules2.mixin(new GridSourceRuntimeModule(), new GridSourceIdeModule()));
+	}
+	
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.tests/.classpath b/org.eclipse.osbp.xtext.gridsource.tests/.classpath
new file mode 100644
index 0000000..0377d77
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.osbp.xtext.gridsource.tests/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.xtext.gridsource.tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.xtext.gridsource.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osbp.xtext.gridsource.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.osbp.xtext.gridsource.tests/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.xtext.gridsource.tests/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.xtext.gridsource.tests/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.xtext.gridsource.tests/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.xtext.gridsource.tests/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.gridsource.tests/META-INF/MANIFEST.MF
index a9b4615..6e873a4 100644
--- a/org.eclipse.osbp.xtext.gridsource.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.xtext.gridsource.tests/META-INF/MANIFEST.MF
@@ -8,9 +8,13 @@
 Require-Bundle: org.eclipse.osbp.xtext.gridsource;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.gridsource.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,
+ org.eclipse.osbp.infogrid.model;bundle-version="0.9.0"
 Import-Package: org.apache.log4j,
  org.junit;version="4.5.0",
  org.junit.runner;version="4.5.0",
@@ -20,4 +24,4 @@
  org.junit.runners.model;version="4.5.0",
  org.hamcrest.core
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Export-Package: org.eclipse.osbp.xtext.gridsource;version="0.9.0"
+Export-Package: org.eclipse.osbp.xtext.gridsource.tests;x-internal=true
diff --git a/org.eclipse.osbp.xtext.gridsource.tests/src-gen/org/eclipse/osbp/xtext/gridsource/tests/GridSourceInjectorProvider.java b/org.eclipse.osbp.xtext.gridsource.tests/src-gen/org/eclipse/osbp/xtext/gridsource/tests/GridSourceInjectorProvider.java
new file mode 100644
index 0000000..7440a29
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/src-gen/org/eclipse/osbp/xtext/gridsource/tests/GridSourceInjectorProvider.java
@@ -0,0 +1,66 @@
+/*
+ * generated by Xtext 2.11.0
+ */
+package org.eclipse.osbp.xtext.gridsource.tests;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.eclipse.osbp.xtext.gridsource.GridSourceRuntimeModule;
+import org.eclipse.osbp.xtext.gridsource.GridSourceStandaloneSetup;
+import org.eclipse.xtext.testing.GlobalRegistries;
+import org.eclipse.xtext.testing.GlobalRegistries.GlobalStateMemento;
+import org.eclipse.xtext.testing.IInjectorProvider;
+import org.eclipse.xtext.testing.IRegistryConfigurator;
+
+public class GridSourceInjectorProvider implements IInjectorProvider, IRegistryConfigurator {
+
+	protected GlobalStateMemento stateBeforeInjectorCreation;
+	protected GlobalStateMemento stateAfterInjectorCreation;
+	protected Injector injector;
+
+	static {
+		GlobalRegistries.initializeDefaults();
+	}
+
+	@Override
+	public Injector getInjector() {
+		if (injector == null) {
+			stateBeforeInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
+			this.injector = internalCreateInjector();
+			stateAfterInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
+		}
+		return injector;
+	}
+
+	protected Injector internalCreateInjector() {
+		return new GridSourceStandaloneSetup() {
+			@Override
+			public Injector createInjector() {
+				return Guice.createInjector(createRuntimeModule());
+			}
+		}.createInjectorAndDoEMFRegistration();
+	}
+
+	protected GridSourceRuntimeModule createRuntimeModule() {
+		// make it work also with Maven/Tycho and OSGI
+		// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=493672
+		return new GridSourceRuntimeModule() {
+			@Override
+			public ClassLoader bindClassLoaderToInstance() {
+				return GridSourceInjectorProvider.class
+						.getClassLoader();
+			}
+		};
+	}
+
+	@Override
+	public void restoreRegistry() {
+		stateBeforeInjectorCreation.restoreGlobalState();
+	}
+
+	@Override
+	public void setupRegistry() {
+		getInjector();
+		stateAfterInjectorCreation.restoreGlobalState();
+	}
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.tests/src/org/eclipse/osbp/xtext/gridsource/tests/GridSourceParsingTest.xtend b/org.eclipse.osbp.xtext.gridsource.tests/src/org/eclipse/osbp/xtext/gridsource/tests/GridSourceParsingTest.xtend
new file mode 100644
index 0000000..7a2dc9a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/src/org/eclipse/osbp/xtext/gridsource/tests/GridSourceParsingTest.xtend
@@ -0,0 +1,29 @@
+/*
+ * generated by Xtext 2.11.0
+ */
+package org.eclipse.osbp.xtext.gridsource.tests
+
+import com.google.inject.Inject
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridSource
+import org.eclipse.xtext.testing.InjectWith
+import org.eclipse.xtext.testing.XtextRunner
+import org.eclipse.xtext.testing.util.ParseHelper
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(XtextRunner)
+@InjectWith(GridSourceInjectorProvider)
+class GridSourceParsingTest {
+	@Inject
+	ParseHelper<CxGridSource> parseHelper
+	
+	@Test
+	def void loadModel() {
+		val result = parseHelper.parse('''
+			Hello Xtext!
+		''')
+		Assert.assertNotNull(result)
+		Assert.assertTrue(result.eResource.errors.isEmpty)
+	}
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/.classpath b/org.eclipse.osbp.xtext.gridsource.ui/.classpath
new file mode 100644
index 0000000..0377d77
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.xtext.gridsource.ui/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osbp.xtext.gridsource.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.xtext.gridsource.ui/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.xtext.gridsource.ui/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.gridsource.ui/META-INF/MANIFEST.MF
index 7705496..33f6814 100644
--- a/org.eclipse.osbp.xtext.gridsource.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.xtext.gridsource.ui/META-INF/MANIFEST.MF
@@ -5,27 +5,43 @@
 Bundle-Version: 0.9.0.qualifier
 Bundle-SymbolicName: org.eclipse.osbp.xtext.gridsource.ui;singleton:=true
 Bundle-ActivationPolicy: lazy
-Require-Bundle: org.eclipse.osbp.xtext.gridsource;bundle-version="[0.9.0,0.10.0)";visibility:=reexport,
- 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.ui.shared;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.xbase.lib;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext.builder;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.xbase.lib;bundle-version="[2.11.0,2.12.0)",
  org.antlr.runtime,
- org.eclipse.xtext.common.types.ui;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext.xbase.ui;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext.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.xbase.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.infogrid.model;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.xtext.basic.ui
+ org.eclipse.osbp.xtext.basic.ui;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.xtend.lib;resolution:=optional,
+ org.eclipse.xtext.junit4,
+ org.eclipse.core.runtime,
+ org.eclipse.xtext.xbase.testing,
+ org.eclipse.ui.workbench;resolution:=optional,
+ org.eclipse.xtext.xbase.junit,
+ org.eclipse.xtext.testing,
+ org.eclipse.osbp.xtext.gridsource.ide;bundle-version="0.9.0"
 Import-Package: org.apache.log4j,
- org.eclipse.osbp.utils.constants;version="0.9.0"
+ org.eclipse.osbp.utils.constants,
+ org.hamcrest.core,
+ org.junit;version="4.5.0",
+ org.junit.runners.model;version="4.5.0",
+ org.junit.runner;version="4.5.0",
+ org.junit.runners;version="4.5.0",
+ org.junit.runner.manipulation;version="4.5.0",
+ org.junit.runner.notification;version="4.5.0"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Export-Package: org.eclipse.osbp.xtext.gridsource.ui.quickfix;version="0.9.0",
- org.eclipse.osbp.xtext.gridsource.ui.contentassist;version="0.9.0",
- org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr;version="0.9.0",
- org.eclipse.osbp.xtext.gridsource.ui.internal;version="0.9.0"
-Bundle-Activator: org.eclipse.osbp.xtext.gridsource.ui.internal.GridSourceActivator
-OSBP-ECView-I18nProvider: 
+Bundle-Activator: org.eclipse.osbp.xtext.gridsource.ui.internal.GridsourceActivator
+Export-Package: org.eclipse.osbp.xtext.gridsource.ui,
+ org.eclipse.osbp.xtext.gridsource.ui.contentassist,
+ org.eclipse.osbp.xtext.gridsource.ui.internal,
+ org.eclipse.osbp.xtext.gridsource.ui.labeling,
+ org.eclipse.osbp.xtext.gridsource.ui.outline,
+ org.eclipse.osbp.xtext.gridsource.ui.quickfix
+Bundle-ClassPath: src/,src-gen/,xtend-gen/,.
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/build.properties b/org.eclipse.osbp.xtext.gridsource.ui/build.properties
index b6bf9e2..57a2f12 100644
--- a/org.eclipse.osbp.xtext.gridsource.ui/build.properties
+++ b/org.eclipse.osbp.xtext.gridsource.ui/build.properties
@@ -1,14 +1,21 @@
 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.xml,\
                icons/,\
                license.html,\
                LICENSE.txt,\
                epl-v10.html,\
-               i18n/
+               i18n/,\
+               src/,\
+               src-gen/,\
+               xtend-gen/
 src.includes = about.properties,  about.mappings,  about.ini,  about.html,  license.html,\
                LICENSE.txt,\
                epl-v10.html			   
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/AbstractGridSourceUiModule.java b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/AbstractGridSourceUiModule.java
index dededa6..4a7d6b0 100644
--- a/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/AbstractGridSourceUiModule.java
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/AbstractGridSourceUiModule.java
@@ -1,251 +1,280 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
+/*
+ * generated by Xtext 2.11.0
  */
 package org.eclipse.osbp.xtext.gridsource.ui;
 
-import org.eclipse.xtext.ui.DefaultUiModule;
+import com.google.inject.Binder;
+import com.google.inject.Provider;
+import com.google.inject.name.Names;
+import org.eclipse.compare.IViewerCreator;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr.GridSourceParser;
+import org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr.PartialGridSourceContentAssistParser;
+import org.eclipse.osbp.xtext.gridsource.ide.contentassist.antlr.internal.InternalGridSourceLexer;
+import org.eclipse.osbp.xtext.gridsource.ui.contentassist.GridSourceProposalProvider;
+import org.eclipse.osbp.xtext.gridsource.ui.labeling.GridSourceDescriptionLabelProvider;
+import org.eclipse.osbp.xtext.gridsource.ui.labeling.GridSourceLabelProvider;
+import org.eclipse.osbp.xtext.gridsource.ui.outline.GridSourceOutlineTreeProvider;
+import org.eclipse.osbp.xtext.gridsource.ui.quickfix.GridSourceQuickfixProvider;
 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.DefaultCommonTypesUiModule;
+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.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.IXtextEditorCallback;
+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.outline.IOutlineTreeProvider;
+import org.eclipse.xtext.ui.editor.outline.impl.IOutlineTreeStructureProvider;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
+import org.eclipse.xtext.ui.editor.quickfix.IssueResolutionProvider;
+import org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage;
+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.DefaultDependentElementsCalculator;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultReferenceUpdater;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultRenameRefactoringProvider;
+import org.eclipse.xtext.ui.refactoring.impl.DefaultRenameStrategy;
+import org.eclipse.xtext.ui.refactoring.ui.DefaultRenameSupport;
+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;
 
 /**
- * Manual modifications go to {org.eclipse.osbp.xtext.gridsource.ui.GridSourceUiModule}
+ * Manual modifications go to {@link GridSourceUiModule}.
  */
 @SuppressWarnings("all")
-public abstract class AbstractGridSourceUiModule extends DefaultUiModule {
-	
+public abstract class AbstractGridSourceUiModule extends DefaultCommonTypesUiModule {
+
 	public AbstractGridSourceUiModule(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.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IProposalConflictHelper> bindIProposalConflictHelper() {
+		return AntlrProposalConflictHelper.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 void configureContentAssistLexer(Binder binder) {
+		binder.bind(Lexer.class)
+			.annotatedWith(Names.named(LexerIdeBindings.CONTENT_ASSIST))
+			.to(InternalGridSourceLexer.class);
 	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public void configureHighlightingLexer(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.parser.antlr.Lexer.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.ui.LexerUIBindings.HIGHLIGHTING)).to(org.eclipse.osbp.xtext.gridsource.parser.antlr.internal.InternalGridSourceLexer.class);
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public void configureHighlightingLexer(Binder binder) {
+		binder.bind(org.eclipse.xtext.parser.antlr.Lexer.class)
+			.annotatedWith(Names.named(LexerIdeBindings.HIGHLIGHTING))
+			.to(org.eclipse.osbp.xtext.gridsource.parser.antlr.internal.InternalGridSourceLexer.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 configureHighlightingTokenDefProvider(Binder binder) {
+		binder.bind(ITokenDefProvider.class)
+			.annotatedWith(Names.named(LexerIdeBindings.HIGHLIGHTING))
+			.to(AntlrTokenDefProvider.class);
 	}
-
-	// contributed by org.eclipse.xtext.generator.exporting.QualifiedNamesFragment
-	public Class<? extends org.eclipse.xtext.ui.refactoring.IDependentElementsCalculator> bindIDependentElementsCalculator() {
-		return org.eclipse.xtext.ui.refactoring.impl.DefaultDependentElementsCalculator.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 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 Class<? extends IContentAssistParser> bindIContentAssistParser() {
+		return GridSourceParser.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 void configureContentAssistLexerProvider(Binder binder) {
+		binder.bind(InternalGridSourceLexer.class).toProvider(LexerProvider.create(InternalGridSourceLexer.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.exporting.QualifiedNamesFragment2
+	public Class<? extends IDependentElementsCalculator> bindIDependentElementsCalculator() {
+		return DefaultDependentElementsCalculator.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.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 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 Class<? extends IXtextEditorCallback> bindIXtextEditorCallback() {
+		return NatureAddingEditorCallback.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 IContextualOutputConfigurationProvider> bindIContextualOutputConfigurationProvider() {
+		return EclipseOutputConfigurationProvider.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 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 Class<? extends org.eclipse.jface.viewers.ILabelProvider> bindILabelProvider() {
-		return org.eclipse.osbp.xtext.gridsource.ui.labeling.GridSourceLabelProvider.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.labeling.LabelProviderFragment
-	public void configureResourceUIServiceLabelProvider(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.jface.viewers.ILabelProvider.class).annotatedWith(org.eclipse.xtext.ui.resource.ResourceServiceDescriptionLabelProvider.class).to(org.eclipse.osbp.xtext.gridsource.ui.labeling.GridSourceDescriptionLabelProvider.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.IOutlineTreeProvider> bindIOutlineTreeProvider() {
-		return org.eclipse.osbp.xtext.gridsource.ui.outline.GridSourceOutlineTreeProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.generator.GeneratorFragment2
+	public IWorkspaceRoot bindIWorkspaceRootToInstance() {
+		return ResourcesPlugin.getWorkspace().getRoot();
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.outline.OutlineTreeProviderFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.outline.impl.IOutlineTreeStructureProvider> bindIOutlineTreeStructureProvider() {
-		return org.eclipse.osbp.xtext.gridsource.ui.outline.GridSourceOutlineTreeProvider.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.quickfix.QuickfixProviderFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.quickfix.IssueResolutionProvider> bindIssueResolutionProvider() {
-		return org.eclipse.osbp.xtext.gridsource.ui.quickfix.GridSourceQuickfixProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2
+	public Class<? extends ILabelProvider> bindILabelProvider() {
+		return GridSourceLabelProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.contentAssist.ContentAssistFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.IContentProposalProvider> bindIContentProposalProvider() {
-		return org.eclipse.osbp.xtext.gridsource.ui.contentassist.GridSourceProposalProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.labeling.LabelProviderFragment2
+	public void configureResourceUIServiceLabelProvider(Binder binder) {
+		binder.bind(ILabelProvider.class).annotatedWith(ResourceServiceDescriptionLabelProvider.class).to(GridSourceDescriptionLabelProvider.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.outline.OutlineTreeProviderFragment2
+	public Class<? extends IOutlineTreeProvider> bindIOutlineTreeProvider() {
+		return GridSourceOutlineTreeProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.antlr.IContentAssistParser> bindIContentAssistParser() {
-		return org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.GridSourceParser.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.outline.OutlineTreeProviderFragment2
+	public Class<? extends IOutlineTreeStructureProvider> bindIOutlineTreeStructureProvider() {
+		return GridSourceOutlineTreeProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment
-	public void configureContentAssistLexerProvider(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal.InternalGridSourceLexer.class).toProvider(org.eclipse.xtext.parser.antlr.LexerProvider.create(org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal.InternalGridSourceLexer.class));
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.quickfix.QuickfixProviderFragment2
+	public Class<? extends IssueResolutionProvider> bindIssueResolutionProvider() {
+		return GridSourceQuickfixProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrUiGeneratorFragment
-	public void configureContentAssistLexer(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.ui.editor.contentassist.antlr.internal.Lexer.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.ui.LexerUIBindings.CONTENT_ASSIST)).to(org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal.InternalGridSourceLexer.class);
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.contentAssist.ContentAssistFragment2
+	public Class<? extends IContentProposalProvider> bindIContentProposalProvider() {
+		return GridSourceProposalProvider.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.refactoring.RefactorElementNameFragment
-	public Class<? extends org.eclipse.xtext.ui.refactoring.IRenameStrategy> bindIRenameStrategy() {
-		return org.eclipse.xtext.ui.refactoring.impl.DefaultRenameStrategy.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IRenameStrategy> bindIRenameStrategy() {
+		return DefaultRenameStrategy.class;
 	}
-
-	// contributed by org.eclipse.xtext.ui.generator.refactoring.RefactorElementNameFragment
-	public Class<? extends org.eclipse.xtext.ui.refactoring.IReferenceUpdater> bindIReferenceUpdater() {
-		return org.eclipse.xtext.ui.refactoring.impl.DefaultReferenceUpdater.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IReferenceUpdater> bindIReferenceUpdater() {
+		return DefaultReferenceUpdater.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.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.IRenameRefactoringProvider> bindIRenameRefactoringProvider() {
-		return org.eclipse.xtext.ui.refactoring.impl.DefaultRenameRefactoringProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IRenameRefactoringProvider> bindIRenameRefactoringProvider() {
+		return DefaultRenameRefactoringProvider.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.ui.refactoring.ui.DefaultRenameSupport.Factory.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.refactoring.RefactorElementNameFragment2
+	public Class<? extends IRenameSupport.Factory> bindIRenameSupport$Factory() {
+		return DefaultRenameSupport.Factory.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public java.lang.ClassLoader bindClassLoaderToInstance() {
-		return getClass().getClassLoader();
+	
+	// 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.access.IJvmTypeProvider.Factory> bindIJvmTypeProvider$Factory() {
-		return org.eclipse.xtext.common.types.access.jdt.JdtTypeProviderFactory.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Provider<? extends TemplatesLanguageConfiguration> provideTemplatesLanguageConfiguration() {
+		return AccessibleCodetemplatesActivator.getTemplatesLanguageConfigurationProvider();
 	}
-
-	// 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.ui.templates.CodetemplatesGeneratorFragment2
+	public Provider<? extends LanguageRegistry> provideLanguageRegistry() {
+		return AccessibleCodetemplatesActivator.getLanguageRegistry();
 	}
-
-	// 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.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	@SingletonBinding(eager=true)
+	public Class<? extends LanguageRegistrar> bindLanguageRegistrar() {
+		return LanguageRegistrar.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.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends XtextTemplatePreferencePage> bindXtextTemplatePreferencePage() {
+		return AdvancedTemplatesPreferencePage.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkHelper> bindIHyperlinkHelper() {
-		return org.eclipse.xtext.common.types.xtext.ui.TypeAwareHyperlinkHelper.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends IPartialEditingContentAssistParser> bindIPartialEditingContentAssistParser() {
+		return PartialGridSourceContentAssistParser.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.xtext.generator.ui.templates.CodetemplatesGeneratorFragment2
+	public Class<? extends IPartialEditingContentAssistContextFactory> bindIPartialEditingContentAssistContextFactory() {
+		return PartialEditingContentAssistContextFactory.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.AbstractJavaBasedContentProposalProvider.ReferenceProposalCreator> bindAbstractJavaBasedContentProposalProvider$ReferenceProposalCreator() {
-		return org.eclipse.xtext.common.types.xtext.ui.TypeAwareReferenceProposalCreator.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.ui.compare.CompareFragment2
+	public Class<? extends IViewerCreator> bindIViewerCreator() {
+		return DefaultViewerCreator.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.types.TypesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.common.types.ui.query.IJavaSearchParticipation> bindIJavaSearchParticipation() {
-		return org.eclipse.xtext.common.types.ui.query.IJavaSearchParticipation.Yes.class;
-	}
-
-	// 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.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.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.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.ui.generator.templates.CodetemplatesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.ui.codetemplates.ui.partialEditing.IPartialContentAssistParser> bindIPartialContentAssistParser() {
-		return org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.PartialGridSourceContentAssistParser.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;
-	}
-
-
+	
 }
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/GridSourceExecutableExtensionFactory.java b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/GridSourceExecutableExtensionFactory.java
index d9a802d..d314e80 100644
--- a/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/GridSourceExecutableExtensionFactory.java
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/GridSourceExecutableExtensionFactory.java
@@ -1,25 +1,13 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
+/*
+ * generated by Xtext 2.11.0
  */
 package org.eclipse.osbp.xtext.gridsource.ui;
 
+import com.google.inject.Injector;
+import org.eclipse.osbp.xtext.gridsource.ui.internal.GridsourceActivator;
 import org.eclipse.xtext.ui.guice.AbstractGuiceAwareExecutableExtensionFactory;
 import org.osgi.framework.Bundle;
 
-import com.google.inject.Injector;
-
-import org.eclipse.osbp.xtext.gridsource.ui.internal.GridSourceActivator;
-
 /**
  * This class was generated. Customizations should only happen in a newly
  * introduced subclass. 
@@ -28,12 +16,12 @@
 
 	@Override
 	protected Bundle getBundle() {
-		return GridSourceActivator.getInstance().getBundle();
+		return GridsourceActivator.getInstance().getBundle();
 	}
 	
 	@Override
 	protected Injector getInjector() {
-		return GridSourceActivator.getInstance().getInjector(GridSourceActivator.ORG_ECLIPSE_OSBP_XTEXT_GRIDSOURCE_GRIDSOURCE);
+		return GridsourceActivator.getInstance().getInjector(GridsourceActivator.ORG_ECLIPSE_OSBP_XTEXT_GRIDSOURCE_GRIDSOURCE);
 	}
 	
 }
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/AbstractGridSourceProposalProvider.java b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/AbstractGridSourceProposalProvider.java
index 8d65353..c8c4c20 100644
--- a/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/AbstractGridSourceProposalProvider.java
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/AbstractGridSourceProposalProvider.java
@@ -1,31 +1,23 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
+/*
+ * generated by Xtext 2.11.0
  */
 package org.eclipse.osbp.xtext.gridsource.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.XtypeProposalProvider;
 
 /**
- * Represents a generated, default implementation of superclass {@link org.eclipse.xtext.xbase.ui.contentassist.XtypeProposalProvider}.
+ * Represents a generated, default implementation of superclass {@link XtypeProposalProvider}.
  * Methods are dynamically dispatched on the first parameter, i.e., you can override them 
  * with a more concrete subtype. 
  */
-@SuppressWarnings("all")
-public class AbstractGridSourceProposalProvider extends org.eclipse.xtext.xbase.ui.contentassist.XtypeProposalProvider {
-		
+public abstract class AbstractGridSourceProposalProvider extends XtypeProposalProvider {
+
 	public void completeSource_Id(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
@@ -134,7 +126,7 @@
 	public void completeStringToResourceStyleConfig_ResourceThemePath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-    
+
 	public void complete_Source(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
@@ -189,12 +181,6 @@
 	public void complete_PropertyImageStyle(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
-	public void complete_QualifiedName(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
-	public void complete_ValidID(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
 	public void complete_StyleConfig(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
@@ -207,9 +193,6 @@
 	public void complete_StyleCompare(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
-	public void complete_ID(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
 	public void complete_INT(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/internal/GridSourceActivator.java b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/internal/GridSourceActivator.java
index f0910e0..241ba63 100644
--- a/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/internal/GridSourceActivator.java
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/internal/GridSourceActivator.java
@@ -1,43 +1,33 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
+/*
+ * generated by Xtext 2.11.0
  */
 package org.eclipse.osbp.xtext.gridsource.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;
+import java.util.Collections;
+import java.util.Map;
+import org.apache.log4j.Logger;
+import org.eclipse.osbp.xtext.gridsource.GridSourceRuntimeModule;
+import org.eclipse.osbp.xtext.gridsource.ui.GridSourceUiModule;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.ui.shared.SharedStateModule;
+import org.eclipse.xtext.util.Modules2;
+import org.osgi.framework.BundleContext;
 
 /**
  * This class was generated. Customizations should only happen in a newly
  * introduced subclass. 
  */
-public class GridSourceActivator extends AbstractUIPlugin {
-	
+public class GridsourceActivator extends AbstractUIPlugin {
+
 	public static final String ORG_ECLIPSE_OSBP_XTEXT_GRIDSOURCE_GRIDSOURCE = "org.eclipse.osbp.xtext.gridsource.GridSource";
 	
-	private static final Logger logger = Logger.getLogger(GridSourceActivator.class);
+	private static final Logger logger = Logger.getLogger(GridsourceActivator.class);
 	
-	private static GridSourceActivator INSTANCE;
+	private static GridsourceActivator INSTANCE;
 	
 	private Map<String, Injector> injectors = Collections.synchronizedMap(Maps.<String, Injector> newHashMapWithExpectedSize(1));
 	
@@ -54,7 +44,7 @@
 		super.stop(context);
 	}
 	
-	public static GridSourceActivator getInstance() {
+	public static GridsourceActivator getInstance() {
 		return INSTANCE;
 	}
 	
@@ -81,20 +71,18 @@
 			throw new RuntimeException("Failed to create injector for " + language, e);
 		}
 	}
-
+	
 	protected Module getRuntimeModule(String grammar) {
 		if (ORG_ECLIPSE_OSBP_XTEXT_GRIDSOURCE_GRIDSOURCE.equals(grammar)) {
-			return new org.eclipse.osbp.xtext.gridsource.GridSourceRuntimeModule();
+			return new GridSourceRuntimeModule();
 		}
-		
 		throw new IllegalArgumentException(grammar);
 	}
 	
 	protected Module getUiModule(String grammar) {
 		if (ORG_ECLIPSE_OSBP_XTEXT_GRIDSOURCE_GRIDSOURCE.equals(grammar)) {
-			return new org.eclipse.osbp.xtext.gridsource.ui.GridSourceUiModule(this);
+			return new GridSourceUiModule(this);
 		}
-		
 		throw new IllegalArgumentException(grammar);
 	}
 	
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceDocumentationTranslator.java b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceDocumentationTranslator.java
index 96ce48b..1362009 100644
--- a/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceDocumentationTranslator.java
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceDocumentationTranslator.java
@@ -14,7 +14,6 @@
 
 import java.util.ResourceBundle;
 
-import org.eclipse.osbp.utils.constants.GeneratorConstants;
 import org.eclipse.osbp.xtext.basic.ui.BasicDSLDocumentationTranslator;
 
 public class GridSourceDocumentationTranslator extends BasicDSLDocumentationTranslator {
@@ -27,6 +26,6 @@
     
     @Override
     protected ResourceBundle getResourceBundle() {
-        return java.util.ResourceBundle.getBundle(GeneratorConstants.I18N_RESOURCE_FULL_BUNDLE_NAME, getLocale(), getClass().getClassLoader());
+        return java.util.ResourceBundle.getBundle("i18n.I18N", getLocale(), getClass().getClassLoader());
     }
 }
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/contentassist/GridSourceProposalProvider.xtend b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/contentassist/GridSourceProposalProvider.xtend
index 0dc5bdd..461e02b 100644
--- a/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/contentassist/GridSourceProposalProvider.xtend
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/contentassist/GridSourceProposalProvider.xtend
@@ -29,6 +29,7 @@
 import org.eclipse.xtext.Keyword
 import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext
 import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor
+import org.eclipse.xtext.RuleCall
 
 class GridSourceProposalProvider extends AbstractGridSourceProposalProvider {
 
@@ -152,6 +153,58 @@
 		ContentAssistContext context) {
 		acceptor.accept(doCreateProposal(" 70 ", createStyledString_GreenFrom(), model.image, 1000, context))
 	}
+	
+	override void completePropertyQuantityStyle_ValuePropertyPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completePropertyQuantityStyle_ValuePropertyPath(model, assignment, context, acceptor);
+		
+		doCompletePropertyQuantityStyle_ValuePropertyPath(model, assignment, context, acceptor);
+	}
+	
+	def void doCompletePropertyQuantityStyle_ValuePropertyPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		val result = new StyledString("Specify property path to the value attribute like ");
+		result.append("'value = amount'", StyledString.QUALIFIER_STYLER);
+		acceptor.accept(
+			doCreateProposal("amount", result, model.image, 1000, context))
+	}
+	
+	override void completePropertyQuantityStyle_UomPropertyPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completePropertyQuantityStyle_ValuePropertyPath(model, assignment, context, acceptor);
+		
+		doCompletePropertyQuantityStyle_ValuePropertyPath(model, assignment, context, acceptor);
+	}
+	
+	def void doCompletePropertyQuantityStyle_UomPropertyPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		val result = new StyledString("Specify property path to the unit of measure attribute like ");
+		result.append("'uom = uom.code'", StyledString.QUALIFIER_STYLER);
+		acceptor.accept(
+			doCreateProposal("uom.code", result, model.image, 1000, context))
+	}
+	
+	override void completePropertyPriceStyle_ValuePropertyPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completePropertyQuantityStyle_ValuePropertyPath(model, assignment, context, acceptor);
+		
+		doCompletePropertyQuantityStyle_ValuePropertyPath(model, assignment, context, acceptor);
+	}
+	
+	def void doCompletePropertyPriceStyle_ValuePropertyPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		val result = new StyledString("Specify property path to the value attribute like ");
+		result.append("'value = amount'", StyledString.QUALIFIER_STYLER);
+		acceptor.accept(
+			doCreateProposal("amount", result, model.image, 1000, context))
+	}
+	
+	override void completePropertyPriceStyle_CurrencyPropertyPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completePropertyQuantityStyle_ValuePropertyPath(model, assignment, context, acceptor);
+		
+		doCompletePropertyQuantityStyle_ValuePropertyPath(model, assignment, context, acceptor);
+	}
+	
+	def void doCompletePropertyPriceStyle_CurrencyPropertyPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		val result = new StyledString("Specify property path to the currency attribute like ");
+		result.append("'currency = currency.isoCode'", StyledString.QUALIFIER_STYLER);
+		acceptor.accept(
+			doCreateProposal("currency.isoCode", result, model.image, 1000, context))
+	}
 
 	override void completePropertyNumberStyle_NumberFormat(EObject model, Assignment assignment,
 		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
diff --git a/org.eclipse.osbp.xtext.gridsource/.classpath b/org.eclipse.osbp.xtext.gridsource/.classpath
new file mode 100644
index 0000000..0377d77
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/"/>
+	<classpathentry kind="src" path="src-gen/"/>
+	<classpathentry kind="src" path="xtend-gen/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.osbp.xtext.gridsource/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.xtext.gridsource/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.xtext.gridsource/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osbp.xtext.gridsource/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.osbp.xtext.gridsource/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.xtext.gridsource/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.xtext.gridsource/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.xtext.gridsource/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.xtext.gridsource/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.gridsource/META-INF/MANIFEST.MF
index b7015fb..248fad4 100644
--- a/org.eclipse.osbp.xtext.gridsource/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.xtext.gridsource/META-INF/MANIFEST.MF
@@ -5,22 +5,23 @@
 Bundle-Version: 0.9.0.qualifier
 Bundle-SymbolicName: org.eclipse.osbp.xtext.gridsource;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.common.types;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.xbase;bundle-version="[2.11.0,2.12.0)";resolution:=optional;visibility:=reexport,
  org.eclipse.osbp.infogrid.model;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.xtext.xbase.lib;bundle-version="[2.11.0,2.12.0)",
+ org.eclipse.xtext.generator;bundle-version="[2.11.0,2.12.0)";resolution:=optional,
  org.apache.commons.logging;bundle-version="1.0.4";resolution:=optional,
  org.eclipse.emf.codegen.ecore;resolution:=optional,
  org.eclipse.emf.mwe.utils;resolution:=optional,
- org.eclipse.emf.mwe2.launch;resolution:=optional,
- org.eclipse.xtext.ecore;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.ecore;bundle-version="[2.11.0,2.12.0)",
  org.eclipse.osbp.dsl.mwe;bundle-version="[0.9.0,0.10.0)";resolution:=optional,
- org.eclipse.xtext.util;bundle-version="[2.7.3,2.8.0)",
- org.eclipse.xtext.xbase.lib;bundle-version="[2.7.3,2.8.0)",
+ org.eclipse.xtext.util;bundle-version="[2.11.0,2.12.0)",
  org.antlr.runtime,
- org.eclipse.xtext.common.types;bundle-version="[2.7.3,2.8.0)",
  org.objectweb.asm;bundle-version="[5.0.1,6.0.0)";resolution:=optional,
- org.eclipse.equinox.common;bundle-version="3.6.200";resolution:=optional
+ org.eclipse.equinox.common;bundle-version="3.6.200";resolution:=optional,
+ org.eclipse.xtend.lib
 Import-Package: org.apache.log4j
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Export-Package: org.eclipse.osbp.xtext.gridsource;version="0.9.0",
@@ -32,3 +33,4 @@
  org.eclipse.osbp.xtext.gridsource.scoping;version="0.9.0",
  org.eclipse.osbp.xtext.gridsource.generator;version="0.9.0",
  org.eclipse.osbp.xtext.gridsource.formatting;version="0.9.0"
+
diff --git a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/AbstractGridSourceRuntimeModule.java b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/AbstractGridSourceRuntimeModule.java
index f8f0a77..7f82f98 100644
--- a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/AbstractGridSourceRuntimeModule.java
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/AbstractGridSourceRuntimeModule.java
@@ -1,31 +1,58 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
+/*
+ * generated by Xtext 2.11.0
  */
 package org.eclipse.osbp.xtext.gridsource;
 
-import java.util.Properties;
-
-import org.eclipse.xtext.Constants;
-import org.eclipse.xtext.service.DefaultRuntimeModule;
-
 import com.google.inject.Binder;
+import com.google.inject.Provider;
 import com.google.inject.name.Names;
+import java.util.Properties;
+import org.eclipse.osbp.xtext.gridsource.parser.antlr.GridSourceAntlrTokenFileProvider;
+import org.eclipse.osbp.xtext.gridsource.parser.antlr.GridSourceParser;
+import org.eclipse.osbp.xtext.gridsource.parser.antlr.internal.InternalGridSourceLexer;
+import org.eclipse.osbp.xtext.gridsource.scoping.GridSourceScopeProvider;
+import org.eclipse.osbp.xtext.gridsource.serializer.GridSourceSemanticSequencer;
+import org.eclipse.osbp.xtext.gridsource.serializer.GridSourceSyntacticSequencer;
+import org.eclipse.osbp.xtext.gridsource.services.GridSourceGrammarAccess;
+import org.eclipse.osbp.xtext.gridsource.validation.GridSourceValidator;
+import org.eclipse.xtext.Constants;
+import org.eclipse.xtext.IGrammarAccess;
+import org.eclipse.xtext.common.types.DefaultCommonTypesRuntimeModule;
+import org.eclipse.xtext.common.types.xtext.TypesAwareDefaultGlobalScopeProvider;
+import org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider;
+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.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.scoping.impl.ImportedNamespaceAwareLocalScopeProvider;
+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;
 
 /**
- * Manual modifications go to {org.eclipse.osbp.xtext.gridsource.GridSourceRuntimeModule}
+ * Manual modifications go to {@link GridSourceRuntimeModule}.
  */
- @SuppressWarnings("all")
-public abstract class AbstractGridSourceRuntimeModule extends DefaultRuntimeModule {
+@SuppressWarnings("all")
+public abstract class AbstractGridSourceRuntimeModule extends DefaultCommonTypesRuntimeModule {
 
 	protected Properties properties = null;
 
@@ -44,139 +71,117 @@
 			binder.bind(String.class).annotatedWith(Names.named(Constants.FILE_EXTENSIONS)).toInstance("gridsource");
 	}
 	
-	// contributed by org.eclipse.xtext.generator.grammarAccess.GrammarAccessFragment
-	public Class<? extends org.eclipse.xtext.IGrammarAccess> bindIGrammarAccess() {
-		return org.eclipse.osbp.xtext.gridsource.services.GridSourceGrammarAccess.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.serializer.SerializerFragment
-	public Class<? extends org.eclipse.xtext.serializer.sequencer.ISemanticSequencer> bindISemanticSequencer() {
-		return org.eclipse.osbp.xtext.gridsource.serializer.GridSourceSemanticSequencer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.serializer.SerializerFragment
-	public Class<? extends org.eclipse.xtext.serializer.sequencer.ISyntacticSequencer> bindISyntacticSequencer() {
-		return org.eclipse.osbp.xtext.gridsource.serializer.GridSourceSyntacticSequencer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.serializer.SerializerFragment
-	public Class<? extends org.eclipse.xtext.serializer.ISerializer> bindISerializer() {
-		return org.eclipse.xtext.serializer.impl.Serializer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public Class<? extends org.eclipse.xtext.parser.IParser> bindIParser() {
-		return org.eclipse.osbp.xtext.gridsource.parser.antlr.GridSourceParser.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public Class<? extends org.eclipse.xtext.parser.ITokenToStringConverter> bindITokenToStringConverter() {
-		return org.eclipse.xtext.parser.antlr.AntlrTokenToStringConverter.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public Class<? extends org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider> bindIAntlrTokenFileProvider() {
-		return org.eclipse.osbp.xtext.gridsource.parser.antlr.GridSourceAntlrTokenFileProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public Class<? extends org.eclipse.xtext.parser.antlr.Lexer> bindLexer() {
-		return org.eclipse.osbp.xtext.gridsource.parser.antlr.internal.InternalGridSourceLexer.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public com.google.inject.Provider<org.eclipse.osbp.xtext.gridsource.parser.antlr.internal.InternalGridSourceLexer> provideInternalGridSourceLexer() {
-		return org.eclipse.xtext.parser.antlr.LexerProvider.create(org.eclipse.osbp.xtext.gridsource.parser.antlr.internal.InternalGridSourceLexer.class);
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public void configureRuntimeLexer(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.parser.antlr.Lexer.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.parser.antlr.LexerBindings.RUNTIME)).to(org.eclipse.osbp.xtext.gridsource.parser.antlr.internal.InternalGridSourceLexer.class);
-	}
-
-	// contributed by org.eclipse.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment
-	public Class<? extends org.eclipse.xtext.parser.antlr.ITokenDefProvider> bindITokenDefProvider() {
-		return org.eclipse.xtext.parser.antlr.AntlrTokenDefProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.validation.ValidatorFragment
-	@org.eclipse.xtext.service.SingletonBinding(eager=true)	public Class<? extends org.eclipse.osbp.xtext.gridsource.validation.GridSourceValidator> bindGridSourceValidator() {
-		return org.eclipse.osbp.xtext.gridsource.validation.GridSourceValidator.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.scoping.AbstractScopingFragment
-	public Class<? extends org.eclipse.xtext.scoping.IScopeProvider> bindIScopeProvider() {
-		return org.eclipse.osbp.xtext.gridsource.scoping.GridSourceScopeProvider.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.scoping.AbstractScopingFragment
-	public void configureIScopeProviderDelegate(com.google.inject.Binder binder) {
-		binder.bind(org.eclipse.xtext.scoping.IScopeProvider.class).annotatedWith(com.google.inject.name.Names.named(org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider.NAMED_DELEGATE)).to(org.eclipse.xtext.scoping.impl.ImportedNamespaceAwareLocalScopeProvider.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.exporting.QualifiedNamesFragment
-	public Class<? extends org.eclipse.xtext.naming.IQualifiedNameProvider> bindIQualifiedNameProvider() {
-		return org.eclipse.xtext.naming.DefaultDeclarativeQualifiedNameProvider.class;
-	}
-
-	// 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.generator.GeneratorFragment
-	public Class<? extends org.eclipse.xtext.generator.IGenerator> bindIGenerator() {
-		return org.eclipse.osbp.xtext.gridsource.generator.GridSourceGenerator.class;
-	}
-
-	// contributed by org.eclipse.xtext.generator.formatting.FormatterFragment
-	public Class<? extends org.eclipse.xtext.formatting.IFormatter> bindIFormatter() {
-		return org.eclipse.osbp.xtext.gridsource.formatting.GridSourceFormatter.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 GridSourceGrammarAccess.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 GridSourceSemanticSequencer.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 GridSourceSyntacticSequencer.class;
 	}
-
-	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
-	public Class<? extends org.eclipse.xtext.scoping.IGlobalScopeProvider> bindIGlobalScopeProvider() {
-		return org.eclipse.xtext.common.types.xtext.TypesAwareDefaultGlobalScopeProvider.class;
+	
+	// contributed by org.eclipse.xtext.xtext.generator.serializer.SerializerFragment2
+	public Class<? extends ISerializer> bindISerializer() {
+		return Serializer.class;
 	}
-
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IParser> bindIParser() {
+		return GridSourceParser.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ITokenToStringConverter> bindITokenToStringConverter() {
+		return AntlrTokenToStringConverter.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends IAntlrTokenFileProvider> bindIAntlrTokenFileProvider() {
+		return GridSourceAntlrTokenFileProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends Lexer> bindLexer() {
+		return InternalGridSourceLexer.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Class<? extends ITokenDefProvider> bindITokenDefProvider() {
+		return AntlrTokenDefProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.parser.antlr.XtextAntlrGeneratorFragment2
+	public Provider<? extends InternalGridSourceLexer> provideInternalGridSourceLexer() {
+		return LexerProvider.create(InternalGridSourceLexer.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(InternalGridSourceLexer.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.validation.ValidatorFragment2
+	@SingletonBinding(eager=true)
+	public Class<? extends GridSourceValidator> bindGridSourceValidator() {
+		return GridSourceValidator.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public Class<? extends IScopeProvider> bindIScopeProvider() {
+		return GridSourceScopeProvider.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(ImportedNamespaceAwareLocalScopeProvider.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.scoping.ImportNamespacesScopingFragment2
+	public void configureIgnoreCaseLinking(Binder binder) {
+		binder.bindConstant().annotatedWith(IgnoreCaseLinking.class).to(false);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.exporting.QualifiedNamesFragment2
+	public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
+		return DefaultDeclarativeQualifiedNameProvider.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.xtext.generator.builder.BuilderIntegrationFragment2
+	public Class<? extends IAllContainersState.Provider> bindIAllContainersState$Provider() {
+		return ResourceSetBasedAllContainersStateProvider.class;
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptions(Binder binder) {
+		binder.bind(IResourceDescriptions.class).to(ResourceSetBasedResourceDescriptions.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.builder.BuilderIntegrationFragment2
+	public void configureIResourceDescriptionsPersisted(Binder binder) {
+		binder.bind(IResourceDescriptions.class).annotatedWith(Names.named(ResourceDescriptionsProvider.PERSISTED_DESCRIPTIONS)).to(ResourceSetBasedResourceDescriptions.class);
+	}
+	
+	// contributed by org.eclipse.xtext.xtext.generator.types.TypesGeneratorFragment2
+	public Class<? extends IGlobalScopeProvider> bindIGlobalScopeProvider() {
+		return TypesAwareDefaultGlobalScopeProvider.class;
+	}
+	
 }
diff --git a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/GridSource.xtextbin b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/GridSource.xtextbin
new file mode 100644
index 0000000..fa8835f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/GridSource.xtextbin
Binary files differ
diff --git a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/GridSourceStandaloneSetupGenerated.java b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/GridSourceStandaloneSetupGenerated.java
index 3591afc..5628b97 100644
--- a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/GridSourceStandaloneSetupGenerated.java
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/GridSourceStandaloneSetupGenerated.java
@@ -1,33 +1,22 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
+/*
+ * generated by Xtext 2.11.0
  */
 package org.eclipse.osbp.xtext.gridsource;
 
-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.XtypeStandaloneSetup;
 
-/**
- * Generated from StandaloneSetup.xpt!
- */
 @SuppressWarnings("all")
 public class GridSourceStandaloneSetupGenerated implements ISetup {
 
+	@Override
 	public Injector createInjectorAndDoEMFRegistration() {
-		org.eclipse.xtext.xbase.XtypeStandaloneSetup.doSetup();
+		XtypeStandaloneSetup.doSetup();
 
 		Injector injector = createInjector();
 		register(injector);
@@ -35,17 +24,14 @@
 	}
 	
 	public Injector createInjector() {
-		return Guice.createInjector(new org.eclipse.osbp.xtext.gridsource.GridSourceRuntimeModule());
+		return Guice.createInjector(new GridSourceRuntimeModule());
 	}
 	
 	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("gridsource", resourceFactory);
-		org.eclipse.xtext.resource.IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("gridsource", serviceProvider);
+		IResourceFactory resourceFactory = injector.getInstance(IResourceFactory.class);
+		IResourceServiceProvider serviceProvider = injector.getInstance(IResourceServiceProvider.class);
 		
-
-
+		Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("gridsource", resourceFactory);
+		IResourceServiceProvider.Registry.INSTANCE.getExtensionToFactoryMap().put("gridsource", serviceProvider);
 	}
 }
diff --git a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/GridSourceAntlrTokenFileProvider.java b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/GridSourceAntlrTokenFileProvider.java
index caf2fb5..cb7f0d3 100644
--- a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/GridSourceAntlrTokenFileProvider.java
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/GridSourceAntlrTokenFileProvider.java
@@ -1,15 +1,5 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
+/*
+ * generated by Xtext 2.11.0
  */
 package org.eclipse.osbp.xtext.gridsource.parser.antlr;
 
@@ -17,9 +7,10 @@
 import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
 
 public class GridSourceAntlrTokenFileProvider implements IAntlrTokenFileProvider {
-	
+
+	@Override
 	public InputStream getAntlrTokenFile() {
 		ClassLoader classLoader = getClass().getClassLoader();
-    	return classLoader.getResourceAsStream("org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.tokens");
+		return classLoader.getResourceAsStream("org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.tokens");
 	}
 }
diff --git a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/GridSourceParser.java b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/GridSourceParser.java
index ceb047e..99cdbb2 100644
--- a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/GridSourceParser.java
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/GridSourceParser.java
@@ -1,49 +1,40 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
+/*
+ * generated by Xtext 2.11.0
  */
 package org.eclipse.osbp.xtext.gridsource.parser.antlr;
 
 import com.google.inject.Inject;
-
-import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.osbp.xtext.gridsource.parser.antlr.internal.InternalGridSourceParser;
 import org.eclipse.osbp.xtext.gridsource.services.GridSourceGrammarAccess;
+import org.eclipse.xtext.parser.antlr.AbstractAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
 
-public class GridSourceParser extends org.eclipse.xtext.parser.antlr.AbstractAntlrParser {
-	
+public class GridSourceParser extends AbstractAntlrParser {
+
 	@Inject
 	private GridSourceGrammarAccess grammarAccess;
-	
+
 	@Override
 	protected void setInitialHiddenTokens(XtextTokenStream tokenStream) {
 		tokenStream.setInitialHiddenTokens("RULE_WS", "RULE_ML_COMMENT", "RULE_SL_COMMENT");
 	}
 	
+
 	@Override
-	protected org.eclipse.osbp.xtext.gridsource.parser.antlr.internal.InternalGridSourceParser createParser(XtextTokenStream stream) {
-		return new org.eclipse.osbp.xtext.gridsource.parser.antlr.internal.InternalGridSourceParser(stream, getGrammarAccess());
+	protected InternalGridSourceParser createParser(XtextTokenStream stream) {
+		return new InternalGridSourceParser(stream, getGrammarAccess());
 	}
-	
+
 	@Override 
 	protected String getDefaultRuleName() {
 		return "Source";
 	}
-	
+
 	public GridSourceGrammarAccess getGrammarAccess() {
 		return this.grammarAccess;
 	}
-	
+
 	public void setGrammarAccess(GridSourceGrammarAccess grammarAccess) {
 		this.grammarAccess = grammarAccess;
 	}
-	
 }
diff --git a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g
index e54fe92..987f105 100644
--- a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g
@@ -1,21 +1,10 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
+/*
+ * generated by Xtext 2.11.0
  */
 grammar InternalGridSource;
 
 options {
 	superClass=AbstractInternalAntlrParser;
-	
 }
 
 @lexer::header {
@@ -27,7 +16,7 @@
 }
 
 @parser::header {
-package org.eclipse.osbp.xtext.gridsource.parser.antlr.internal; 
+package org.eclipse.osbp.xtext.gridsource.parser.antlr.internal;
 
 import org.eclipse.xtext.*;
 import org.eclipse.xtext.parser.*;
@@ -46,2651 +35,2678 @@
 @parser::members {
 
  	private GridSourceGrammarAccess grammarAccess;
- 	
+
     public InternalGridSourceParser(TokenStream input, GridSourceGrammarAccess grammarAccess) {
         this(input);
         this.grammarAccess = grammarAccess;
         registerRules(grammarAccess.getGrammar());
     }
-    
+
     @Override
     protected String getFirstRuleName() {
-    	return "Source";	
+    	return "Source";
    	}
-   	
+
    	@Override
    	protected GridSourceGrammarAccess getGrammarAccess() {
    		return grammarAccess;
    	}
+
 }
 
-@rulecatch { 
-    catch (RecognitionException re) { 
-        recover(input,re); 
+@rulecatch {
+    catch (RecognitionException re) {
+        recover(input,re);
         appendSkippedTokens();
-    } 
+    }
 }
 
-
-
-
 // Entry rule entryRuleSource
-entryRuleSource returns [EObject current=null] 
-	:
+entryRuleSource returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getSourceRule()); }
-	 iv_ruleSource=ruleSource 
-	 { $current=$iv_ruleSource.current; } 
-	 EOF 
-;
+	iv_ruleSource=ruleSource
+	{ $current=$iv_ruleSource.current; }
+	EOF;
 
 // Rule Source
-ruleSource returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='gridsource' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getSourceAccess().getGridsourceKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getSourceAccess().getIdQualifiedNameParserRuleCall_1_0()); 
-	    }
-		lv_id_1_0=ruleQualifiedName		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getSourceRule());
-	        }
-       		set(
-       			$current, 
-       			"id",
-        		lv_id_1_0, 
-        		"QualifiedName");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='for' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getSourceAccess().getForKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getSourceAccess().getRootTypeJvmTypeReferenceParserRuleCall_3_0()); 
-	    }
-		lv_rootType_3_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getSourceRule());
-	        }
-       		set(
-       			$current, 
-       			"rootType",
-        		lv_rootType_3_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_4='{' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_4());
-    }
-	otherlv_5='inputs' 
-    {
-    	newLeafNode(otherlv_5, grammarAccess.getSourceAccess().getInputsKeyword_5());
-    }
-	otherlv_6='{' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_6());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getSourceAccess().getInputsInputParserRuleCall_7_0()); 
-	    }
-		lv_inputs_7_0=ruleInput		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getSourceRule());
-	        }
-       		add(
-       			$current, 
-       			"inputs",
-        		lv_inputs_7_0, 
-        		"Input");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_8='}' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_8());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getSourceAccess().getPropertiesPropertyParserRuleCall_9_0()); 
-	    }
-		lv_properties_9_0=ruleProperty		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getSourceRule());
-	        }
-       		add(
-       			$current, 
-       			"properties",
-        		lv_properties_9_0, 
-        		"Property");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_10='}' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_10());
-    }
-)
+ruleSource returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='gridsource'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getSourceAccess().getGridsourceKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSourceAccess().getIdQualifiedNameParserRuleCall_1_0());
+				}
+				lv_id_1_0=ruleQualifiedName
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSourceRule());
+					}
+					set(
+						$current,
+						"id",
+						lv_id_1_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.QualifiedName");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2='for'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getSourceAccess().getForKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSourceAccess().getRootTypeJvmTypeReferenceParserRuleCall_3_0());
+				}
+				lv_rootType_3_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSourceRule());
+					}
+					set(
+						$current,
+						"rootType",
+						lv_rootType_3_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_4='{'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_4());
+		}
+		otherlv_5='inputs'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getSourceAccess().getInputsKeyword_5());
+		}
+		otherlv_6='{'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_6());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSourceAccess().getInputsInputParserRuleCall_7_0());
+				}
+				lv_inputs_7_0=ruleInput
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSourceRule());
+					}
+					add(
+						$current,
+						"inputs",
+						lv_inputs_7_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.Input");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_8='}'
+		{
+			newLeafNode(otherlv_8, grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_8());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getSourceAccess().getPropertiesPropertyParserRuleCall_9_0());
+				}
+				lv_properties_9_0=ruleProperty
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getSourceRule());
+					}
+					add(
+						$current,
+						"properties",
+						lv_properties_9_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.Property");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_10='}'
+		{
+			newLeafNode(otherlv_10, grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_10());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleInput
-entryRuleInput returns [EObject current=null] 
-	:
+entryRuleInput returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getInputRule()); }
-	 iv_ruleInput=ruleInput 
-	 { $current=$iv_ruleInput.current; } 
-	 EOF 
-;
+	iv_ruleInput=ruleInput
+	{ $current=$iv_ruleInput.current; }
+	EOF;
 
 // Rule Input
-ruleInput returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='inputType' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getInputAccess().getInputTypeKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getInputAccess().getInputTypeJvmTypeReferenceParserRuleCall_1_0()); 
-	    }
-		lv_inputType_1_0=ruleJvmTypeReference		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getInputRule());
-	        }
-       		set(
-       			$current, 
-       			"inputType",
-        		lv_inputType_1_0, 
-        		"JvmTypeReference");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='filters' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getInputAccess().getFiltersKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_3_0()); 
-	    }
-		lv_filters_3_0=ruleEQFilter		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getInputRule());
-	        }
-       		add(
-       			$current, 
-       			"filters",
-        		lv_filters_3_0, 
-        		"EQFilter");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_4='&&' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getInputAccess().getAmpersandAmpersandKeyword_4_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_4_1_0()); 
-	    }
-		lv_filters_5_0=ruleEQFilter		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getInputRule());
-	        }
-       		add(
-       			$current, 
-       			"filters",
-        		lv_filters_5_0, 
-        		"EQFilter");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))*)
+ruleInput returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='inputType'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getInputAccess().getInputTypeKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getInputAccess().getInputTypeJvmTypeReferenceParserRuleCall_1_0());
+				}
+				lv_inputType_1_0=ruleJvmTypeReference
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getInputRule());
+					}
+					set(
+						$current,
+						"inputType",
+						lv_inputType_1_0,
+						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2='filters'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getInputAccess().getFiltersKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_3_0());
+				}
+				lv_filters_3_0=ruleEQFilter
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getInputRule());
+					}
+					add(
+						$current,
+						"filters",
+						lv_filters_3_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.EQFilter");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_4='&&'
+			{
+				newLeafNode(otherlv_4, grammarAccess.getInputAccess().getAmpersandAmpersandKeyword_4_0());
+			}
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_4_1_0());
+					}
+					lv_filters_5_0=ruleEQFilter
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getInputRule());
+						}
+						add(
+							$current,
+							"filters",
+							lv_filters_5_0,
+							"org.eclipse.osbp.xtext.gridsource.GridSource.EQFilter");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)*
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleEQFilter
-entryRuleEQFilter returns [EObject current=null] 
-	:
+entryRuleEQFilter returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getEQFilterRule()); }
-	 iv_ruleEQFilter=ruleEQFilter 
-	 { $current=$iv_ruleEQFilter.current; } 
-	 EOF 
-;
+	iv_ruleEQFilter=ruleEQFilter
+	{ $current=$iv_ruleEQFilter.current; }
+	EOF;
 
 // Rule EQFilter
-ruleEQFilter returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getEQFilterAccess().getCxGridSourceEQFilterAction_0(),
-            $current);
-    }
-)	otherlv_1='root:' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getEQFilterAccess().getRootKeyword_1());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEQFilterAccess().getRootTypePropertyPathNestedFieldParserRuleCall_2_0()); 
-	    }
-		lv_rootTypePropertyPath_2_0=ruleNestedField		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEQFilterRule());
-	        }
-       		set(
-       			$current, 
-       			"rootTypePropertyPath",
-        		lv_rootTypePropertyPath_2_0, 
-        		"NestedField");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_3='=' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getEQFilterAccess().getEqualsSignKeyword_3());
-    }
-	otherlv_4='input:' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getEQFilterAccess().getInputKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getEQFilterAccess().getInputTypePropertyPathNestedFieldParserRuleCall_5_0()); 
-	    }
-		lv_inputTypePropertyPath_5_0=ruleNestedField		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getEQFilterRule());
-	        }
-       		set(
-       			$current, 
-       			"inputTypePropertyPath",
-        		lv_inputTypePropertyPath_5_0, 
-        		"NestedField");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+ruleEQFilter returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getEQFilterAccess().getCxGridSourceEQFilterAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='root:'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getEQFilterAccess().getRootKeyword_1());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEQFilterAccess().getRootTypePropertyPathNestedFieldParserRuleCall_2_0());
+				}
+				lv_rootTypePropertyPath_2_0=ruleNestedField
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEQFilterRule());
+					}
+					set(
+						$current,
+						"rootTypePropertyPath",
+						lv_rootTypePropertyPath_2_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_3='='
+		{
+			newLeafNode(otherlv_3, grammarAccess.getEQFilterAccess().getEqualsSignKeyword_3());
+		}
+		otherlv_4='input:'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getEQFilterAccess().getInputKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getEQFilterAccess().getInputTypePropertyPathNestedFieldParserRuleCall_5_0());
+				}
+				lv_inputTypePropertyPath_5_0=ruleNestedField
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getEQFilterRule());
+					}
+					set(
+						$current,
+						"inputTypePropertyPath",
+						lv_inputTypePropertyPath_5_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleProperty
-entryRuleProperty returns [EObject current=null] 
-	:
+entryRuleProperty returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyRule()); }
-	 iv_ruleProperty=ruleProperty 
-	 { $current=$iv_ruleProperty.current; } 
-	 EOF 
-;
+	iv_ruleProperty=ruleProperty
+	{ $current=$iv_ruleProperty.current; }
+	EOF;
 
 // Rule Property
-ruleProperty returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='prop' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getPropertyAccess().getPropKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyAccess().getPathNestedFieldParserRuleCall_1_0()); 
-	    }
-		lv_path_1_0=ruleNestedField		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyRule());
-	        }
-       		set(
-       			$current, 
-       			"path",
-        		lv_path_1_0, 
-        		"NestedField");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_2='style' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getPropertyAccess().getStyleKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyAccess().getStylePropertyStyleParserRuleCall_3_0()); 
-	    }
-		lv_style_3_0=rulePropertyStyle		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyRule());
-	        }
-       		set(
-       			$current, 
-       			"style",
-        		lv_style_3_0, 
-        		"PropertyStyle");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+ruleProperty returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='prop'
+		{
+			newLeafNode(otherlv_0, grammarAccess.getPropertyAccess().getPropKeyword_0());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPropertyAccess().getPathNestedFieldParserRuleCall_1_0());
+				}
+				lv_path_1_0=ruleNestedField
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPropertyRule());
+					}
+					set(
+						$current,
+						"path",
+						lv_path_1_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_2='style'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getPropertyAccess().getStyleKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPropertyAccess().getStylePropertyStyleParserRuleCall_3_0());
+				}
+				lv_style_3_0=rulePropertyStyle
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPropertyRule());
+					}
+					set(
+						$current,
+						"style",
+						lv_style_3_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.PropertyStyle");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleNestedField
-entryRuleNestedField returns [EObject current=null] 
-	:
+entryRuleNestedField returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getNestedFieldRule()); }
-	 iv_ruleNestedField=ruleNestedField 
-	 { $current=$iv_ruleNestedField.current; } 
-	 EOF 
-;
+	iv_ruleNestedField=ruleNestedField
+	{ $current=$iv_ruleNestedField.current; }
+	EOF;
 
 // Rule NestedField
-ruleNestedField returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getNestedFieldAccess().getCxGridNestedFieldAction_0(),
-            $current);
-    }
-)(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getNestedFieldRule());
-	        }
-        }
-	otherlv_1=RULE_ID
-	{
-		newLeafNode(otherlv_1, grammarAccess.getNestedFieldAccess().getFieldJvmOperationCrossReference_1_0()); 
-	}
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getNestedFieldAccess().getPathNestedPathParserRuleCall_2_0()); 
-	    }
-		lv_path_2_0=ruleNestedPath		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getNestedFieldRule());
-	        }
-       		set(
-       			$current, 
-       			"path",
-        		lv_path_2_0, 
-        		"NestedPath");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?)
+ruleNestedField returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getNestedFieldAccess().getCxGridNestedFieldAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getNestedFieldRule());
+					}
+				}
+				otherlv_1=RULE_ID
+				{
+					newLeafNode(otherlv_1, grammarAccess.getNestedFieldAccess().getFieldJvmOperationCrossReference_1_0());
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getNestedFieldAccess().getPathNestedPathParserRuleCall_2_0());
+				}
+				lv_path_2_0=ruleNestedPath
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getNestedFieldRule());
+					}
+					set(
+						$current,
+						"path",
+						lv_path_2_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedPath");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleNestedPath
-entryRuleNestedPath returns [EObject current=null] 
-	:
+entryRuleNestedPath returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getNestedPathRule()); }
-	 iv_ruleNestedPath=ruleNestedPath 
-	 { $current=$iv_ruleNestedPath.current; } 
-	 EOF 
-;
+	iv_ruleNestedPath=ruleNestedPath
+	{ $current=$iv_ruleNestedPath.current; }
+	EOF;
 
 // Rule NestedPath
-ruleNestedPath returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getNestedPathAccess().getCxGridNestedPathAction_0(),
-            $current);
-    }
-)	otherlv_1='.' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getNestedPathAccess().getFullStopKeyword_1());
-    }
-(
-(
+ruleNestedPath returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getNestedPathAccess().getCxGridNestedPathAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='.'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getNestedPathRule());
-	        }
-        }
-	otherlv_2=RULE_ID
-	{
-		newLeafNode(otherlv_2, grammarAccess.getNestedPathAccess().getFieldJvmOperationCrossReference_2_0()); 
-	}
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getNestedPathAccess().getPathNestedPathParserRuleCall_3_0()); 
-	    }
-		lv_path_3_0=ruleNestedPath		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getNestedPathRule());
-	        }
-       		set(
-       			$current, 
-       			"path",
-        		lv_path_3_0, 
-        		"NestedPath");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)?)
+			newLeafNode(otherlv_1, grammarAccess.getNestedPathAccess().getFullStopKeyword_1());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getNestedPathRule());
+					}
+				}
+				otherlv_2=RULE_ID
+				{
+					newLeafNode(otherlv_2, grammarAccess.getNestedPathAccess().getFieldJvmOperationCrossReference_2_0());
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getNestedPathAccess().getPathNestedPathParserRuleCall_3_0());
+				}
+				lv_path_3_0=ruleNestedPath
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getNestedPathRule());
+					}
+					set(
+						$current,
+						"path",
+						lv_path_3_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedPath");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyStyle
-entryRulePropertyStyle returns [EObject current=null] 
-	:
+entryRulePropertyStyle returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyStyleRule()); }
-	 iv_rulePropertyStyle=rulePropertyStyle 
-	 { $current=$iv_rulePropertyStyle.current; } 
-	 EOF 
-;
+	iv_rulePropertyStyle=rulePropertyStyle
+	{ $current=$iv_rulePropertyStyle.current; }
+	EOF;
 
 // Rule PropertyStyle
-rulePropertyStyle returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyButtonStyleParserRuleCall_0()); 
-    }
-    this_PropertyButtonStyle_0=rulePropertyButtonStyle
-    { 
-        $current = $this_PropertyButtonStyle_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyHtmlStyleParserRuleCall_1()); 
-    }
-    this_PropertyHtmlStyle_1=rulePropertyHtmlStyle
-    { 
-        $current = $this_PropertyHtmlStyle_1.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyProgressbarStyleParserRuleCall_2()); 
-    }
-    this_PropertyProgressbarStyle_2=rulePropertyProgressbarStyle
-    { 
-        $current = $this_PropertyProgressbarStyle_2.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyTextStyleParserRuleCall_3()); 
-    }
-    this_PropertyTextStyle_3=rulePropertyTextStyle
-    { 
-        $current = $this_PropertyTextStyle_3.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyBooleanStyleParserRuleCall_4()); 
-    }
-    this_PropertyBooleanStyle_4=rulePropertyBooleanStyle
-    { 
-        $current = $this_PropertyBooleanStyle_4.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyDateStyleParserRuleCall_5()); 
-    }
-    this_PropertyDateStyle_5=rulePropertyDateStyle
-    { 
-        $current = $this_PropertyDateStyle_5.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyNumberStyleParserRuleCall_6()); 
-    }
-    this_PropertyNumberStyle_6=rulePropertyNumberStyle
-    { 
-        $current = $this_PropertyNumberStyle_6.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyImageStyleParserRuleCall_7()); 
-    }
-    this_PropertyImageStyle_7=rulePropertyImageStyle
-    { 
-        $current = $this_PropertyImageStyle_7.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyQuantityStyleParserRuleCall_8()); 
-    }
-    this_PropertyQuantityStyle_8=rulePropertyQuantityStyle
-    { 
-        $current = $this_PropertyQuantityStyle_8.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyPriceStyleParserRuleCall_9()); 
-    }
-    this_PropertyPriceStyle_9=rulePropertyPriceStyle
-    { 
-        $current = $this_PropertyPriceStyle_9.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getPropertyStyleAccess().getGridPropIndicatorStyleParserRuleCall_10()); 
-    }
-    this_GridPropIndicatorStyle_10=ruleGridPropIndicatorStyle
-    { 
-        $current = $this_GridPropIndicatorStyle_10.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
+rulePropertyStyle returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyButtonStyleParserRuleCall_0());
+		}
+		this_PropertyButtonStyle_0=rulePropertyButtonStyle
+		{
+			$current = $this_PropertyButtonStyle_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyHtmlStyleParserRuleCall_1());
+		}
+		this_PropertyHtmlStyle_1=rulePropertyHtmlStyle
+		{
+			$current = $this_PropertyHtmlStyle_1.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyProgressbarStyleParserRuleCall_2());
+		}
+		this_PropertyProgressbarStyle_2=rulePropertyProgressbarStyle
+		{
+			$current = $this_PropertyProgressbarStyle_2.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyTextStyleParserRuleCall_3());
+		}
+		this_PropertyTextStyle_3=rulePropertyTextStyle
+		{
+			$current = $this_PropertyTextStyle_3.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyBooleanStyleParserRuleCall_4());
+		}
+		this_PropertyBooleanStyle_4=rulePropertyBooleanStyle
+		{
+			$current = $this_PropertyBooleanStyle_4.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyDateStyleParserRuleCall_5());
+		}
+		this_PropertyDateStyle_5=rulePropertyDateStyle
+		{
+			$current = $this_PropertyDateStyle_5.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyNumberStyleParserRuleCall_6());
+		}
+		this_PropertyNumberStyle_6=rulePropertyNumberStyle
+		{
+			$current = $this_PropertyNumberStyle_6.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyImageStyleParserRuleCall_7());
+		}
+		this_PropertyImageStyle_7=rulePropertyImageStyle
+		{
+			$current = $this_PropertyImageStyle_7.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyQuantityStyleParserRuleCall_8());
+		}
+		this_PropertyQuantityStyle_8=rulePropertyQuantityStyle
+		{
+			$current = $this_PropertyQuantityStyle_8.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyPriceStyleParserRuleCall_9());
+		}
+		this_PropertyPriceStyle_9=rulePropertyPriceStyle
+		{
+			$current = $this_PropertyPriceStyle_9.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getPropertyStyleAccess().getGridPropIndicatorStyleParserRuleCall_10());
+		}
+		this_GridPropIndicatorStyle_10=ruleGridPropIndicatorStyle
+		{
+			$current = $this_GridPropIndicatorStyle_10.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyButtonStyle
-entryRulePropertyButtonStyle returns [EObject current=null] 
-	:
+entryRulePropertyButtonStyle returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyButtonStyleRule()); }
-	 iv_rulePropertyButtonStyle=rulePropertyButtonStyle 
-	 { $current=$iv_rulePropertyButtonStyle.current; } 
-	 EOF 
-;
+	iv_rulePropertyButtonStyle=rulePropertyButtonStyle
+	{ $current=$iv_rulePropertyButtonStyle.current; }
+	EOF;
 
 // Rule PropertyButtonStyle
-rulePropertyButtonStyle returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyButtonStyleAccess().getCxGridPropButtonStyleAction_0(),
-            $current);
-    }
-)	otherlv_1='buttonStyle' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyButtonStyleAccess().getButtonStyleKeyword_1());
-    }
-	otherlv_2='eventTopic' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getPropertyButtonStyleAccess().getEventTopicKeyword_2());
-    }
-(
-(
-		lv_eventTopic_3_0=RULE_STRING
+rulePropertyButtonStyle returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyButtonStyleAccess().getCxGridPropButtonStyleAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='buttonStyle'
 		{
-			newLeafNode(lv_eventTopic_3_0, grammarAccess.getPropertyButtonStyleAccess().getEventTopicSTRINGTerminalRuleCall_3_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getPropertyButtonStyleAccess().getButtonStyleKeyword_1());
 		}
+		otherlv_2='eventTopic'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyButtonStyleRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"eventTopic",
-        		lv_eventTopic_3_0, 
-        		"STRING");
-	    }
-
-)
-))
+			newLeafNode(otherlv_2, grammarAccess.getPropertyButtonStyleAccess().getEventTopicKeyword_2());
+		}
+		(
+			(
+				lv_eventTopic_3_0=RULE_STRING
+				{
+					newLeafNode(lv_eventTopic_3_0, grammarAccess.getPropertyButtonStyleAccess().getEventTopicSTRINGTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getPropertyButtonStyleRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"eventTopic",
+						lv_eventTopic_3_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyHtmlStyle
-entryRulePropertyHtmlStyle returns [EObject current=null] 
-	:
+entryRulePropertyHtmlStyle returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyHtmlStyleRule()); }
-	 iv_rulePropertyHtmlStyle=rulePropertyHtmlStyle 
-	 { $current=$iv_rulePropertyHtmlStyle.current; } 
-	 EOF 
-;
+	iv_rulePropertyHtmlStyle=rulePropertyHtmlStyle
+	{ $current=$iv_rulePropertyHtmlStyle.current; }
+	EOF;
 
 // Rule PropertyHtmlStyle
-rulePropertyHtmlStyle returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyHtmlStyleAccess().getCxGridPropHtmlStyleAction_0(),
-            $current);
-    }
-)	otherlv_1='htmlStyle' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyHtmlStyleAccess().getHtmlStyleKeyword_1());
-    }
-)
+rulePropertyHtmlStyle returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyHtmlStyleAccess().getCxGridPropHtmlStyleAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='htmlStyle'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getPropertyHtmlStyleAccess().getHtmlStyleKeyword_1());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyBooleanStyle
-entryRulePropertyBooleanStyle returns [EObject current=null] 
-	:
+entryRulePropertyBooleanStyle returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyBooleanStyleRule()); }
-	 iv_rulePropertyBooleanStyle=rulePropertyBooleanStyle 
-	 { $current=$iv_rulePropertyBooleanStyle.current; } 
-	 EOF 
-;
+	iv_rulePropertyBooleanStyle=rulePropertyBooleanStyle
+	{ $current=$iv_rulePropertyBooleanStyle.current; }
+	EOF;
 
 // Rule PropertyBooleanStyle
-rulePropertyBooleanStyle returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyBooleanStyleAccess().getCxGridPropBooleanStyleAction_0(),
-            $current);
-    }
-)	otherlv_1='boolStyle' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyBooleanStyleAccess().getBoolStyleKeyword_1());
-    }
-)
+rulePropertyBooleanStyle returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyBooleanStyleAccess().getCxGridPropBooleanStyleAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='boolStyle'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getPropertyBooleanStyleAccess().getBoolStyleKeyword_1());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyDateStyle
-entryRulePropertyDateStyle returns [EObject current=null] 
-	:
+entryRulePropertyDateStyle returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyDateStyleRule()); }
-	 iv_rulePropertyDateStyle=rulePropertyDateStyle 
-	 { $current=$iv_rulePropertyDateStyle.current; } 
-	 EOF 
-;
+	iv_rulePropertyDateStyle=rulePropertyDateStyle
+	{ $current=$iv_rulePropertyDateStyle.current; }
+	EOF;
 
 // Rule PropertyDateStyle
-rulePropertyDateStyle returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyDateStyleAccess().getCxGridPropDateStyleAction_0(),
-            $current);
-    }
-)	otherlv_1='dateStyle' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyDateStyleAccess().getDateStyleKeyword_1());
-    }
-	otherlv_2='format' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getPropertyDateStyleAccess().getFormatKeyword_2());
-    }
-(
-(
-		lv_dateFormat_3_0=RULE_STRING
+rulePropertyDateStyle returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyDateStyleAccess().getCxGridPropDateStyleAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='dateStyle'
 		{
-			newLeafNode(lv_dateFormat_3_0, grammarAccess.getPropertyDateStyleAccess().getDateFormatSTRINGTerminalRuleCall_3_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getPropertyDateStyleAccess().getDateStyleKeyword_1());
 		}
+		otherlv_2='format'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyDateStyleRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"dateFormat",
-        		lv_dateFormat_3_0, 
-        		"STRING");
-	    }
-
-)
-))
+			newLeafNode(otherlv_2, grammarAccess.getPropertyDateStyleAccess().getFormatKeyword_2());
+		}
+		(
+			(
+				lv_dateFormat_3_0=RULE_STRING
+				{
+					newLeafNode(lv_dateFormat_3_0, grammarAccess.getPropertyDateStyleAccess().getDateFormatSTRINGTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getPropertyDateStyleRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"dateFormat",
+						lv_dateFormat_3_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyNumberStyle
-entryRulePropertyNumberStyle returns [EObject current=null] 
-	:
+entryRulePropertyNumberStyle returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyNumberStyleRule()); }
-	 iv_rulePropertyNumberStyle=rulePropertyNumberStyle 
-	 { $current=$iv_rulePropertyNumberStyle.current; } 
-	 EOF 
-;
+	iv_rulePropertyNumberStyle=rulePropertyNumberStyle
+	{ $current=$iv_rulePropertyNumberStyle.current; }
+	EOF;
 
 // Rule PropertyNumberStyle
-rulePropertyNumberStyle returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyNumberStyleAccess().getCxGridPropNumberStyleAction_0(),
-            $current);
-    }
-)	otherlv_1='numberStyle' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyNumberStyleAccess().getNumberStyleKeyword_1());
-    }
-	otherlv_2='format' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getPropertyNumberStyleAccess().getFormatKeyword_2());
-    }
-(
-(
-		lv_numberFormat_3_0=RULE_STRING
+rulePropertyNumberStyle returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyNumberStyleAccess().getCxGridPropNumberStyleAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='numberStyle'
 		{
-			newLeafNode(lv_numberFormat_3_0, grammarAccess.getPropertyNumberStyleAccess().getNumberFormatSTRINGTerminalRuleCall_3_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getPropertyNumberStyleAccess().getNumberStyleKeyword_1());
 		}
+		otherlv_2='format'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyNumberStyleRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"numberFormat",
-        		lv_numberFormat_3_0, 
-        		"STRING");
-	    }
-
-)
-))
+			newLeafNode(otherlv_2, grammarAccess.getPropertyNumberStyleAccess().getFormatKeyword_2());
+		}
+		(
+			(
+				lv_numberFormat_3_0=RULE_STRING
+				{
+					newLeafNode(lv_numberFormat_3_0, grammarAccess.getPropertyNumberStyleAccess().getNumberFormatSTRINGTerminalRuleCall_3_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getPropertyNumberStyleRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"numberFormat",
+						lv_numberFormat_3_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyProgressbarStyle
-entryRulePropertyProgressbarStyle returns [EObject current=null] 
-	:
+entryRulePropertyProgressbarStyle returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyProgressbarStyleRule()); }
-	 iv_rulePropertyProgressbarStyle=rulePropertyProgressbarStyle 
-	 { $current=$iv_rulePropertyProgressbarStyle.current; } 
-	 EOF 
-;
+	iv_rulePropertyProgressbarStyle=rulePropertyProgressbarStyle
+	{ $current=$iv_rulePropertyProgressbarStyle.current; }
+	EOF;
 
 // Rule PropertyProgressbarStyle
-rulePropertyProgressbarStyle returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyProgressbarStyleAccess().getCxGridPropProgressbarStyleAction_0(),
-            $current);
-    }
-)	otherlv_1='progressbarStyle' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyProgressbarStyleAccess().getProgressbarStyleKeyword_1());
-    }
-	otherlv_2='max' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getPropertyProgressbarStyleAccess().getMaxKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueLDoubleParserRuleCall_3_0()); 
-	    }
-		lv_maxValue_3_0=ruleLDouble		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyProgressbarStyleRule());
-	        }
-       		set(
-       			$current, 
-       			"maxValue",
-        		lv_maxValue_3_0, 
-        		"LDouble");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+rulePropertyProgressbarStyle returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyProgressbarStyleAccess().getCxGridPropProgressbarStyleAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='progressbarStyle'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getPropertyProgressbarStyleAccess().getProgressbarStyleKeyword_1());
+		}
+		otherlv_2='max'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getPropertyProgressbarStyleAccess().getMaxKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueLDoubleParserRuleCall_3_0());
+				}
+				lv_maxValue_3_0=ruleLDouble
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPropertyProgressbarStyleRule());
+					}
+					set(
+						$current,
+						"maxValue",
+						lv_maxValue_3_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.LDouble");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleGridPropIndicatorStyle
-entryRuleGridPropIndicatorStyle returns [EObject current=null] 
-	:
+entryRuleGridPropIndicatorStyle returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getGridPropIndicatorStyleRule()); }
-	 iv_ruleGridPropIndicatorStyle=ruleGridPropIndicatorStyle 
-	 { $current=$iv_ruleGridPropIndicatorStyle.current; } 
-	 EOF 
-;
+	iv_ruleGridPropIndicatorStyle=ruleGridPropIndicatorStyle
+	{ $current=$iv_ruleGridPropIndicatorStyle.current; }
+	EOF;
 
 // Rule GridPropIndicatorStyle
-ruleGridPropIndicatorStyle returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getGridPropIndicatorStyleAccess().getCxGridPropIndicatorStyleAction_0(),
-            $current);
-    }
-)	otherlv_1='indicatorStyle' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getGridPropIndicatorStyleAccess().getIndicatorStyleKeyword_1());
-    }
-	otherlv_2='greenFrom' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getGridPropIndicatorStyleAccess().getGreenFromKeyword_2());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsLDoubleParserRuleCall_3_0()); 
-	    }
-		lv_greenStarts_3_0=ruleLDouble		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getGridPropIndicatorStyleRule());
-	        }
-       		set(
-       			$current, 
-       			"greenStarts",
-        		lv_greenStarts_3_0, 
-        		"LDouble");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_4='redUntil' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getGridPropIndicatorStyleAccess().getRedUntilKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsLDoubleParserRuleCall_5_0()); 
-	    }
-		lv_redEnds_5_0=ruleLDouble		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getGridPropIndicatorStyleRule());
-	        }
-       		set(
-       			$current, 
-       			"redEnds",
-        		lv_redEnds_5_0, 
-        		"LDouble");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+ruleGridPropIndicatorStyle returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getGridPropIndicatorStyleAccess().getCxGridPropIndicatorStyleAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='indicatorStyle'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getGridPropIndicatorStyleAccess().getIndicatorStyleKeyword_1());
+		}
+		otherlv_2='greenFrom'
+		{
+			newLeafNode(otherlv_2, grammarAccess.getGridPropIndicatorStyleAccess().getGreenFromKeyword_2());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsLDoubleParserRuleCall_3_0());
+				}
+				lv_greenStarts_3_0=ruleLDouble
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getGridPropIndicatorStyleRule());
+					}
+					set(
+						$current,
+						"greenStarts",
+						lv_greenStarts_3_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.LDouble");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_4='redUntil'
+		{
+			newLeafNode(otherlv_4, grammarAccess.getGridPropIndicatorStyleAccess().getRedUntilKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsLDoubleParserRuleCall_5_0());
+				}
+				lv_redEnds_5_0=ruleLDouble
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getGridPropIndicatorStyleRule());
+					}
+					set(
+						$current,
+						"redEnds",
+						lv_redEnds_5_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.LDouble");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyQuantityStyle
-entryRulePropertyQuantityStyle returns [EObject current=null] 
-	:
+entryRulePropertyQuantityStyle returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyQuantityStyleRule()); }
-	 iv_rulePropertyQuantityStyle=rulePropertyQuantityStyle 
-	 { $current=$iv_rulePropertyQuantityStyle.current; } 
-	 EOF 
-;
+	iv_rulePropertyQuantityStyle=rulePropertyQuantityStyle
+	{ $current=$iv_rulePropertyQuantityStyle.current; }
+	EOF;
 
 // Rule PropertyQuantityStyle
-rulePropertyQuantityStyle returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyQuantityStyleAccess().getCxGridPropQuantityStyleAction_0(),
-            $current);
-    }
-)	otherlv_1='quantityStyle' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyQuantityStyleAccess().getQuantityStyleKeyword_1());
-    }
-(
-(
-		lv_htmlPattern_2_0=RULE_STRING
+rulePropertyQuantityStyle returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyQuantityStyleAccess().getCxGridPropQuantityStyleAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='quantityStyle'
 		{
-			newLeafNode(lv_htmlPattern_2_0, grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getPropertyQuantityStyleAccess().getQuantityStyleKeyword_1());
 		}
+		(
+			(
+				lv_htmlPattern_2_0=RULE_STRING
+				{
+					newLeafNode(lv_htmlPattern_2_0, grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getPropertyQuantityStyleRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"htmlPattern",
+						lv_htmlPattern_2_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)?
+		otherlv_3='value'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyQuantityStyleRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"htmlPattern",
-        		lv_htmlPattern_2_0, 
-        		"STRING");
-	    }
-
-)
-)?	otherlv_3='value' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getPropertyQuantityStyleAccess().getValueKeyword_3());
-    }
-	otherlv_4='=' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0()); 
-	    }
-		lv_valuePropertyPath_5_0=ruleNestedField		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyQuantityStyleRule());
-	        }
-       		set(
-       			$current, 
-       			"valuePropertyPath",
-        		lv_valuePropertyPath_5_0, 
-        		"NestedField");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_6='(' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getPropertyQuantityStyleAccess().getLeftParenthesisKeyword_6_0());
-    }
-	otherlv_7='format' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getPropertyQuantityStyleAccess().getFormatKeyword_6_1());
-    }
-(
-(
-		lv_valueNumberFormat_8_0=RULE_STRING
-		{
-			newLeafNode(lv_valueNumberFormat_8_0, grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0()); 
+			newLeafNode(otherlv_3, grammarAccess.getPropertyQuantityStyleAccess().getValueKeyword_3());
 		}
+		otherlv_4='='
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyQuantityStyleRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"valueNumberFormat",
-        		lv_valueNumberFormat_8_0, 
-        		"STRING");
-	    }
-
-)
-)	otherlv_9=')' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getPropertyQuantityStyleAccess().getRightParenthesisKeyword_6_3());
-    }
-)?	otherlv_10='uom' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getPropertyQuantityStyleAccess().getUomKeyword_7());
-    }
-	otherlv_11='=' 
-    {
-    	newLeafNode(otherlv_11, grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_8());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathNestedFieldParserRuleCall_9_0()); 
-	    }
-		lv_uomPropertyPath_12_0=ruleNestedField		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyQuantityStyleRule());
-	        }
-       		set(
-       			$current, 
-       			"uomPropertyPath",
-        		lv_uomPropertyPath_12_0, 
-        		"NestedField");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+			newLeafNode(otherlv_4, grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0());
+				}
+				lv_valuePropertyPath_5_0=ruleNestedField
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPropertyQuantityStyleRule());
+					}
+					set(
+						$current,
+						"valuePropertyPath",
+						lv_valuePropertyPath_5_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_6='('
+			{
+				newLeafNode(otherlv_6, grammarAccess.getPropertyQuantityStyleAccess().getLeftParenthesisKeyword_6_0());
+			}
+			otherlv_7='format'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getPropertyQuantityStyleAccess().getFormatKeyword_6_1());
+			}
+			(
+				(
+					lv_valueNumberFormat_8_0=RULE_STRING
+					{
+						newLeafNode(lv_valueNumberFormat_8_0, grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getPropertyQuantityStyleRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"valueNumberFormat",
+							lv_valueNumberFormat_8_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+			otherlv_9=')'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getPropertyQuantityStyleAccess().getRightParenthesisKeyword_6_3());
+			}
+		)?
+		otherlv_10='uom'
+		{
+			newLeafNode(otherlv_10, grammarAccess.getPropertyQuantityStyleAccess().getUomKeyword_7());
+		}
+		otherlv_11='='
+		{
+			newLeafNode(otherlv_11, grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_8());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathNestedFieldParserRuleCall_9_0());
+				}
+				lv_uomPropertyPath_12_0=ruleNestedField
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPropertyQuantityStyleRule());
+					}
+					set(
+						$current,
+						"uomPropertyPath",
+						lv_uomPropertyPath_12_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyPriceStyle
-entryRulePropertyPriceStyle returns [EObject current=null] 
-	:
+entryRulePropertyPriceStyle returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyPriceStyleRule()); }
-	 iv_rulePropertyPriceStyle=rulePropertyPriceStyle 
-	 { $current=$iv_rulePropertyPriceStyle.current; } 
-	 EOF 
-;
+	iv_rulePropertyPriceStyle=rulePropertyPriceStyle
+	{ $current=$iv_rulePropertyPriceStyle.current; }
+	EOF;
 
 // Rule PropertyPriceStyle
-rulePropertyPriceStyle returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyPriceStyleAccess().getCxGridPropPriceStyleAction_0(),
-            $current);
-    }
-)	otherlv_1='priceStyle' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyPriceStyleAccess().getPriceStyleKeyword_1());
-    }
-(
-(
-		lv_htmlPattern_2_0=RULE_STRING
+rulePropertyPriceStyle returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyPriceStyleAccess().getCxGridPropPriceStyleAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='priceStyle'
 		{
-			newLeafNode(lv_htmlPattern_2_0, grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getPropertyPriceStyleAccess().getPriceStyleKeyword_1());
 		}
+		(
+			(
+				lv_htmlPattern_2_0=RULE_STRING
+				{
+					newLeafNode(lv_htmlPattern_2_0, grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getPropertyPriceStyleRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"htmlPattern",
+						lv_htmlPattern_2_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)?
+		otherlv_3='value'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyPriceStyleRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"htmlPattern",
-        		lv_htmlPattern_2_0, 
-        		"STRING");
-	    }
-
-)
-)?	otherlv_3='value' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getPropertyPriceStyleAccess().getValueKeyword_3());
-    }
-	otherlv_4='=' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_4());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0()); 
-	    }
-		lv_valuePropertyPath_5_0=ruleNestedField		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyPriceStyleRule());
-	        }
-       		set(
-       			$current, 
-       			"valuePropertyPath",
-        		lv_valuePropertyPath_5_0, 
-        		"NestedField");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(	otherlv_6='(' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getPropertyPriceStyleAccess().getLeftParenthesisKeyword_6_0());
-    }
-	otherlv_7='format' 
-    {
-    	newLeafNode(otherlv_7, grammarAccess.getPropertyPriceStyleAccess().getFormatKeyword_6_1());
-    }
-(
-(
-		lv_valueNumberFormat_8_0=RULE_STRING
-		{
-			newLeafNode(lv_valueNumberFormat_8_0, grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0()); 
+			newLeafNode(otherlv_3, grammarAccess.getPropertyPriceStyleAccess().getValueKeyword_3());
 		}
+		otherlv_4='='
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyPriceStyleRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"valueNumberFormat",
-        		lv_valueNumberFormat_8_0, 
-        		"STRING");
-	    }
-
-)
-)	otherlv_9=')' 
-    {
-    	newLeafNode(otherlv_9, grammarAccess.getPropertyPriceStyleAccess().getRightParenthesisKeyword_6_3());
-    }
-)?	otherlv_10='currency' 
-    {
-    	newLeafNode(otherlv_10, grammarAccess.getPropertyPriceStyleAccess().getCurrencyKeyword_7());
-    }
-	otherlv_11='=' 
-    {
-    	newLeafNode(otherlv_11, grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_8());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathNestedFieldParserRuleCall_9_0()); 
-	    }
-		lv_currencyPropertyPath_12_0=ruleNestedField		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyPriceStyleRule());
-	        }
-       		set(
-       			$current, 
-       			"currencyPropertyPath",
-        		lv_currencyPropertyPath_12_0, 
-        		"NestedField");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))
+			newLeafNode(otherlv_4, grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_4());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0());
+				}
+				lv_valuePropertyPath_5_0=ruleNestedField
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPropertyPriceStyleRule());
+					}
+					set(
+						$current,
+						"valuePropertyPath",
+						lv_valuePropertyPath_5_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			otherlv_6='('
+			{
+				newLeafNode(otherlv_6, grammarAccess.getPropertyPriceStyleAccess().getLeftParenthesisKeyword_6_0());
+			}
+			otherlv_7='format'
+			{
+				newLeafNode(otherlv_7, grammarAccess.getPropertyPriceStyleAccess().getFormatKeyword_6_1());
+			}
+			(
+				(
+					lv_valueNumberFormat_8_0=RULE_STRING
+					{
+						newLeafNode(lv_valueNumberFormat_8_0, grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getPropertyPriceStyleRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"valueNumberFormat",
+							lv_valueNumberFormat_8_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+			otherlv_9=')'
+			{
+				newLeafNode(otherlv_9, grammarAccess.getPropertyPriceStyleAccess().getRightParenthesisKeyword_6_3());
+			}
+		)?
+		otherlv_10='currency'
+		{
+			newLeafNode(otherlv_10, grammarAccess.getPropertyPriceStyleAccess().getCurrencyKeyword_7());
+		}
+		otherlv_11='='
+		{
+			newLeafNode(otherlv_11, grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_8());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathNestedFieldParserRuleCall_9_0());
+				}
+				lv_currencyPropertyPath_12_0=ruleNestedField
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPropertyPriceStyleRule());
+					}
+					set(
+						$current,
+						"currencyPropertyPath",
+						lv_currencyPropertyPath_12_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyTextStyle
-entryRulePropertyTextStyle returns [EObject current=null] 
-	:
+entryRulePropertyTextStyle returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyTextStyleRule()); }
-	 iv_rulePropertyTextStyle=rulePropertyTextStyle 
-	 { $current=$iv_rulePropertyTextStyle.current; } 
-	 EOF 
-;
+	iv_rulePropertyTextStyle=rulePropertyTextStyle
+	{ $current=$iv_rulePropertyTextStyle.current; }
+	EOF;
 
 // Rule PropertyTextStyle
-rulePropertyTextStyle returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyTextStyleAccess().getCxGridPropTextStyleAction_0(),
-            $current);
-    }
-)	otherlv_1='textStyle' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyTextStyleAccess().getTextStyleKeyword_1());
-    }
-)
+rulePropertyTextStyle returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyTextStyleAccess().getCxGridPropTextStyleAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='textStyle'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getPropertyTextStyleAccess().getTextStyleKeyword_1());
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRulePropertyImageStyle
-entryRulePropertyImageStyle returns [EObject current=null] 
-	:
+entryRulePropertyImageStyle returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getPropertyImageStyleRule()); }
-	 iv_rulePropertyImageStyle=rulePropertyImageStyle 
-	 { $current=$iv_rulePropertyImageStyle.current; } 
-	 EOF 
-;
+	iv_rulePropertyImageStyle=rulePropertyImageStyle
+	{ $current=$iv_rulePropertyImageStyle.current; }
+	EOF;
 
 // Rule PropertyImageStyle
-rulePropertyImageStyle returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-    {
-        $current = forceCreateModelElement(
-            grammarAccess.getPropertyImageStyleAccess().getCxGridPropImageStyleAction_0(),
-            $current);
-    }
-)	otherlv_1='imageStyle' 
-    {
-    	newLeafNode(otherlv_1, grammarAccess.getPropertyImageStyleAccess().getImageStyleKeyword_1());
-    }
-(	otherlv_2='eventTopic' 
-    {
-    	newLeafNode(otherlv_2, grammarAccess.getPropertyImageStyleAccess().getEventTopicKeyword_2_0());
-    }
-(
-(
-		lv_eventTopic_3_0=RULE_STRING
+rulePropertyImageStyle returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getPropertyImageStyleAccess().getCxGridPropImageStyleAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='imageStyle'
 		{
-			newLeafNode(lv_eventTopic_3_0, grammarAccess.getPropertyImageStyleAccess().getEventTopicSTRINGTerminalRuleCall_2_1_0()); 
+			newLeafNode(otherlv_1, grammarAccess.getPropertyImageStyleAccess().getImageStyleKeyword_1());
 		}
+		(
+			otherlv_2='eventTopic'
+			{
+				newLeafNode(otherlv_2, grammarAccess.getPropertyImageStyleAccess().getEventTopicKeyword_2_0());
+			}
+			(
+				(
+					lv_eventTopic_3_0=RULE_STRING
+					{
+						newLeafNode(lv_eventTopic_3_0, grammarAccess.getPropertyImageStyleAccess().getEventTopicSTRINGTerminalRuleCall_2_1_0());
+					}
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getPropertyImageStyleRule());
+						}
+						setWithLastConsumed(
+							$current,
+							"eventTopic",
+							lv_eventTopic_3_0,
+							"org.eclipse.xtext.xbase.Xtype.STRING");
+					}
+				)
+			)
+		)?
+		otherlv_4='{'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getPropertyImageStyleRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"eventTopic",
-        		lv_eventTopic_3_0, 
-        		"STRING");
-	    }
-
-)
-))?	otherlv_4='{' 
-    {
-    	newLeafNode(otherlv_4, grammarAccess.getPropertyImageStyleAccess().getLeftCurlyBracketKeyword_3());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getPropertyImageStyleAccess().getConfigsStyleConfigParserRuleCall_4_0()); 
-	    }
-		lv_configs_5_0=ruleStyleConfig		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getPropertyImageStyleRule());
-	        }
-       		add(
-       			$current, 
-       			"configs",
-        		lv_configs_5_0, 
-        		"StyleConfig");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)*	otherlv_6='}' 
-    {
-    	newLeafNode(otherlv_6, grammarAccess.getPropertyImageStyleAccess().getRightCurlyBracketKeyword_5());
-    }
-)
+			newLeafNode(otherlv_4, grammarAccess.getPropertyImageStyleAccess().getLeftCurlyBracketKeyword_3());
+		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getPropertyImageStyleAccess().getConfigsStyleConfigParserRuleCall_4_0());
+				}
+				lv_configs_5_0=ruleStyleConfig
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getPropertyImageStyleRule());
+					}
+					add(
+						$current,
+						"configs",
+						lv_configs_5_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.StyleConfig");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)*
+		otherlv_6='}'
+		{
+			newLeafNode(otherlv_6, grammarAccess.getPropertyImageStyleAccess().getRightCurlyBracketKeyword_5());
+		}
+	)
 ;
 
-
-
-
-
 // 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 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 entryRuleStyleConfig
-entryRuleStyleConfig returns [EObject current=null] 
-	:
+entryRuleStyleConfig returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getStyleConfigRule()); }
-	 iv_ruleStyleConfig=ruleStyleConfig 
-	 { $current=$iv_ruleStyleConfig.current; } 
-	 EOF 
-;
+	iv_ruleStyleConfig=ruleStyleConfig
+	{ $current=$iv_ruleStyleConfig.current; }
+	EOF;
 
 // Rule StyleConfig
-ruleStyleConfig returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getStyleConfigAccess().getNumericToResourceStyleConfigParserRuleCall_0()); 
-    }
-    this_NumericToResourceStyleConfig_0=ruleNumericToResourceStyleConfig
-    { 
-        $current = $this_NumericToResourceStyleConfig_0.current; 
-        afterParserOrEnumRuleCall();
-    }
-
-    |
-    { 
-        newCompositeNode(grammarAccess.getStyleConfigAccess().getStringToResourceStyleConfigParserRuleCall_1()); 
-    }
-    this_StringToResourceStyleConfig_1=ruleStringToResourceStyleConfig
-    { 
-        $current = $this_StringToResourceStyleConfig_1.current; 
-        afterParserOrEnumRuleCall();
-    }
-)
+ruleStyleConfig returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getStyleConfigAccess().getNumericToResourceStyleConfigParserRuleCall_0());
+		}
+		this_NumericToResourceStyleConfig_0=ruleNumericToResourceStyleConfig
+		{
+			$current = $this_NumericToResourceStyleConfig_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getStyleConfigAccess().getStringToResourceStyleConfigParserRuleCall_1());
+		}
+		this_StringToResourceStyleConfig_1=ruleStringToResourceStyleConfig
+		{
+			$current = $this_StringToResourceStyleConfig_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleNumericToResourceStyleConfig
-entryRuleNumericToResourceStyleConfig returns [EObject current=null] 
-	:
+entryRuleNumericToResourceStyleConfig returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getNumericToResourceStyleConfigRule()); }
-	 iv_ruleNumericToResourceStyleConfig=ruleNumericToResourceStyleConfig 
-	 { $current=$iv_ruleNumericToResourceStyleConfig.current; } 
-	 EOF 
-;
+	iv_ruleNumericToResourceStyleConfig=ruleNumericToResourceStyleConfig
+	{ $current=$iv_ruleNumericToResourceStyleConfig.current; }
+	EOF;
 
 // Rule NumericToResourceStyleConfig
-ruleNumericToResourceStyleConfig returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='number' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getNumericToResourceStyleConfigAccess().getNumberKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0()); 
-	    }
-		lv_compare_1_0=ruleStyleCompare		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getNumericToResourceStyleConfigRule());
-	        }
-       		set(
-       			$current, 
-       			"compare",
-        		lv_compare_1_0, 
-        		"StyleCompare");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getNumericToResourceStyleConfigAccess().getValueLDoubleParserRuleCall_2_0()); 
-	    }
-		lv_value_2_0=ruleLDouble		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getNumericToResourceStyleConfigRule());
-	        }
-       		set(
-       			$current, 
-       			"value",
-        		lv_value_2_0, 
-        		"LDouble");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)	otherlv_3='then' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getNumericToResourceStyleConfigAccess().getThenKeyword_3());
-    }
-(
-(
-		lv_resourceThemePath_4_0=RULE_THEME_RESOURCE
+ruleNumericToResourceStyleConfig returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='number'
 		{
-			newLeafNode(lv_resourceThemePath_4_0, grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getNumericToResourceStyleConfigAccess().getNumberKeyword_0());
 		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0());
+				}
+				lv_compare_1_0=ruleStyleCompare
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getNumericToResourceStyleConfigRule());
+					}
+					set(
+						$current,
+						"compare",
+						lv_compare_1_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.StyleCompare");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getNumericToResourceStyleConfigAccess().getValueLDoubleParserRuleCall_2_0());
+				}
+				lv_value_2_0=ruleLDouble
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getNumericToResourceStyleConfigRule());
+					}
+					set(
+						$current,
+						"value",
+						lv_value_2_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.LDouble");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		otherlv_3='then'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getNumericToResourceStyleConfigRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"resourceThemePath",
-        		lv_resourceThemePath_4_0, 
-        		"THEME_RESOURCE");
-	    }
-
-)
-))
+			newLeafNode(otherlv_3, grammarAccess.getNumericToResourceStyleConfigAccess().getThenKeyword_3());
+		}
+		(
+			(
+				lv_resourceThemePath_4_0=RULE_THEME_RESOURCE
+				{
+					newLeafNode(lv_resourceThemePath_4_0, grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getNumericToResourceStyleConfigRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"resourceThemePath",
+						lv_resourceThemePath_4_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.THEME_RESOURCE");
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleStringToResourceStyleConfig
-entryRuleStringToResourceStyleConfig returns [EObject current=null] 
-	:
+entryRuleStringToResourceStyleConfig returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getStringToResourceStyleConfigRule()); }
-	 iv_ruleStringToResourceStyleConfig=ruleStringToResourceStyleConfig 
-	 { $current=$iv_ruleStringToResourceStyleConfig.current; } 
-	 EOF 
-;
+	iv_ruleStringToResourceStyleConfig=ruleStringToResourceStyleConfig
+	{ $current=$iv_ruleStringToResourceStyleConfig.current; }
+	EOF;
 
 // Rule StringToResourceStyleConfig
-ruleStringToResourceStyleConfig returns [EObject current=null] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(	otherlv_0='string' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getStringToResourceStyleConfigAccess().getStringKeyword_0());
-    }
-(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getStringToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0()); 
-	    }
-		lv_compare_1_0=ruleStyleCompare		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getStringToResourceStyleConfigRule());
-	        }
-       		set(
-       			$current, 
-       			"compare",
-        		lv_compare_1_0, 
-        		"StyleCompare");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)(
-(
-		lv_value_2_0=RULE_STRING
+ruleStringToResourceStyleConfig returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='string'
 		{
-			newLeafNode(lv_value_2_0, grammarAccess.getStringToResourceStyleConfigAccess().getValueSTRINGTerminalRuleCall_2_0()); 
+			newLeafNode(otherlv_0, grammarAccess.getStringToResourceStyleConfigAccess().getStringKeyword_0());
 		}
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getStringToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0());
+				}
+				lv_compare_1_0=ruleStyleCompare
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getStringToResourceStyleConfigRule());
+					}
+					set(
+						$current,
+						"compare",
+						lv_compare_1_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.StyleCompare");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				lv_value_2_0=RULE_STRING
+				{
+					newLeafNode(lv_value_2_0, grammarAccess.getStringToResourceStyleConfigAccess().getValueSTRINGTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getStringToResourceStyleConfigRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"value",
+						lv_value_2_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)
+		otherlv_3='then'
 		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getStringToResourceStyleConfigRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"value",
-        		lv_value_2_0, 
-        		"STRING");
-	    }
-
-)
-)	otherlv_3='then' 
-    {
-    	newLeafNode(otherlv_3, grammarAccess.getStringToResourceStyleConfigAccess().getThenKeyword_3());
-    }
-(
-(
-		lv_resourceThemePath_4_0=RULE_THEME_RESOURCE
-		{
-			newLeafNode(lv_resourceThemePath_4_0, grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0()); 
+			newLeafNode(otherlv_3, grammarAccess.getStringToResourceStyleConfigAccess().getThenKeyword_3());
 		}
-		{
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getStringToResourceStyleConfigRule());
-	        }
-       		setWithLastConsumed(
-       			$current, 
-       			"resourceThemePath",
-        		lv_resourceThemePath_4_0, 
-        		"THEME_RESOURCE");
-	    }
-
-)
-))
+		(
+			(
+				lv_resourceThemePath_4_0=RULE_THEME_RESOURCE
+				{
+					newLeafNode(lv_resourceThemePath_4_0, grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getStringToResourceStyleConfigRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"resourceThemePath",
+						lv_resourceThemePath_4_0,
+						"org.eclipse.osbp.xtext.gridsource.GridSource.THEME_RESOURCE");
+				}
+			)
+		)
+	)
 ;
 
-
-
-
-
 // Entry rule entryRuleLInt
-entryRuleLInt returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getLIntRule()); } 
-	 iv_ruleLInt=ruleLInt 
-	 { $current=$iv_ruleLInt.current.getText(); }  
-	 EOF 
-;
+entryRuleLInt returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getLIntRule()); }
+	iv_ruleLInt=ruleLInt
+	{ $current=$iv_ruleLInt.current.getText(); }
+	EOF;
 
 // Rule LInt
-ruleLInt returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-((
-	kw='+' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getLIntAccess().getPlusSignKeyword_0_0()); 
-    }
-
-    |
-	kw='-' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getLIntAccess().getHyphenMinusKeyword_0_1()); 
-    }
-)?    this_INT_2=RULE_INT    {
-		$current.merge(this_INT_2);
-    }
-
-    { 
-    newLeafNode(this_INT_2, grammarAccess.getLIntAccess().getINTTerminalRuleCall_1()); 
-    }
-)
-    ;
-
-
-
-
+ruleLInt returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			kw='+'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getLIntAccess().getPlusSignKeyword_0_0());
+			}
+			    |
+			kw='-'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getLIntAccess().getHyphenMinusKeyword_0_1());
+			}
+		)?
+		this_INT_2=RULE_INT
+		{
+			$current.merge(this_INT_2);
+		}
+		{
+			newLeafNode(this_INT_2, grammarAccess.getLIntAccess().getINTTerminalRuleCall_1());
+		}
+	)
+;
 
 // Entry rule entryRuleLDouble
-entryRuleLDouble returns [String current=null] 
-	:
-	{ newCompositeNode(grammarAccess.getLDoubleRule()); } 
-	 iv_ruleLDouble=ruleLDouble 
-	 { $current=$iv_ruleLDouble.current.getText(); }  
-	 EOF 
-;
+entryRuleLDouble returns [String current=null]:
+	{ newCompositeNode(grammarAccess.getLDoubleRule()); }
+	iv_ruleLDouble=ruleLDouble
+	{ $current=$iv_ruleLDouble.current.getText(); }
+	EOF;
 
 // Rule LDouble
-ruleLDouble returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
-    @init { enterRule(); 
-    }
-    @after { leaveRule(); }:
-(
-    { 
-        newCompositeNode(grammarAccess.getLDoubleAccess().getLIntParserRuleCall_0()); 
-    }
-    this_LInt_0=ruleLInt    {
-		$current.merge(this_LInt_0);
-    }
-
-    { 
-        afterParserOrEnumRuleCall();
-    }
-(
-	kw='.' 
-    {
-        $current.merge(kw);
-        newLeafNode(kw, grammarAccess.getLDoubleAccess().getFullStopKeyword_1_0()); 
-    }
-    this_INT_2=RULE_INT    {
-		$current.merge(this_INT_2);
-    }
-
-    { 
-    newLeafNode(this_INT_2, grammarAccess.getLDoubleAccess().getINTTerminalRuleCall_1_1()); 
-    }
-)?)
-    ;
-
-
-
-
+ruleLDouble returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getLDoubleAccess().getLIntParserRuleCall_0());
+		}
+		this_LInt_0=ruleLInt
+		{
+			$current.merge(this_LInt_0);
+		}
+		{
+			afterParserOrEnumRuleCall();
+		}
+		(
+			kw='.'
+			{
+				$current.merge(kw);
+				newLeafNode(kw, grammarAccess.getLDoubleAccess().getFullStopKeyword_1_0());
+			}
+			this_INT_2=RULE_INT
+			{
+				$current.merge(this_INT_2);
+			}
+			{
+				newLeafNode(this_INT_2, grammarAccess.getLDoubleAccess().getINTTerminalRuleCall_1_1());
+			}
+		)?
+	)
+;
 
 // 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 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(); }:
-(	otherlv_0='import' 
-    {
-    	newLeafNode(otherlv_0, grammarAccess.getXImportDeclarationAccess().getImportKeyword_0());
-    }
-(((
-(
-		lv_static_1_0=	'static' 
-    {
-        newLeafNode(lv_static_1_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_1_0_0_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXImportDeclarationRule());
-	        }
-       		setWithLastConsumed($current, "static", true, "static");
-	    }
-
-)
-)(
-(
-		lv_extension_2_0=	'extension' 
-    {
-        newLeafNode(lv_extension_2_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_1_0_1_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXImportDeclarationRule());
-	        }
-       		setWithLastConsumed($current, "extension", true, "extension");
-	    }
-
-)
-)?(
-(
+ruleXImportDeclaration returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		otherlv_0='import'
 		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXImportDeclarationRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_0_2_0()); 
-	    }
-		ruleQualifiedNameInStaticImport		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)((
-(
-		lv_wildcard_4_0=	'*' 
-    {
-        newLeafNode(lv_wildcard_4_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_1_0_3_0_0());
-    }
- 
-	    {
-	        if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXImportDeclarationRule());
-	        }
-       		setWithLastConsumed($current, "wildcard", true, "*");
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_1_0_3_1_0()); 
-	    }
-		lv_memberName_5_0=ruleValidID		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
-	        }
-       		set(
-       			$current, 
-       			"memberName",
-        		lv_memberName_5_0, 
-        		"ValidID");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)))
-    |(
-(
-		{
-			if ($current==null) {
-	            $current = createModelElement(grammarAccess.getXImportDeclarationRule());
-	        }
-        }
-		{ 
-	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_1_0()); 
-	    }
-		ruleQualifiedName		{ 
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-)
-    |(
-(
-		{ 
-	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_2_0()); 
-	    }
-		lv_importedNamespace_7_0=ruleQualifiedNameWithWildcard		{
-	        if ($current==null) {
-	            $current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
-	        }
-       		set(
-       			$current, 
-       			"importedNamespace",
-        		lv_importedNamespace_7_0, 
-        		"QualifiedNameWithWildcard");
-	        afterParserOrEnumRuleCall();
-	    }
-
-)
-))(	otherlv_8=';' 
-    {
-    	newLeafNode(otherlv_8, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_2());
-    }
-)?)
+			newLeafNode(otherlv_0, grammarAccess.getXImportDeclarationAccess().getImportKeyword_0());
+		}
+		(
+			(
+				(
+					(
+						lv_static_1_0='static'
+						{
+							newLeafNode(lv_static_1_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_1_0_0_0());
+						}
+						{
+							if ($current==null) {
+								$current = createModelElement(grammarAccess.getXImportDeclarationRule());
+							}
+							setWithLastConsumed($current, "static", true, "static");
+						}
+					)
+				)
+				(
+					(
+						lv_extension_2_0='extension'
+						{
+							newLeafNode(lv_extension_2_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_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_1_0_2_0());
+						}
+						ruleQualifiedNameInStaticImport
+						{
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)
+				(
+					(
+						(
+							lv_wildcard_4_0='*'
+							{
+								newLeafNode(lv_wildcard_4_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_1_0_3_0_0());
+							}
+							{
+								if ($current==null) {
+									$current = createModelElement(grammarAccess.getXImportDeclarationRule());
+								}
+								setWithLastConsumed($current, "wildcard", true, "*");
+							}
+						)
+					)
+					    |
+					(
+						(
+							{
+								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_1_0_3_1_0());
+							}
+							lv_memberName_5_0=ruleValidID
+							{
+								if ($current==null) {
+									$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
+								}
+								set(
+									$current,
+									"memberName",
+									lv_memberName_5_0,
+									"org.eclipse.osbp.xtext.gridsource.GridSource.ValidID");
+								afterParserOrEnumRuleCall();
+							}
+						)
+					)
+				)
+			)
+			    |
+			(
+				(
+					{
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getXImportDeclarationRule());
+						}
+					}
+					{
+						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_1_0());
+					}
+					ruleQualifiedName
+					{
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			    |
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_2_0());
+					}
+					lv_importedNamespace_7_0=ruleQualifiedNameWithWildcard
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
+						}
+						set(
+							$current,
+							"importedNamespace",
+							lv_importedNamespace_7_0,
+							"org.eclipse.xtext.xbase.Xtype.QualifiedNameWithWildcard");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)
+		(
+			otherlv_8=';'
+			{
+				newLeafNode(otherlv_8, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_2());
+			}
+		)?
+	)
 ;
 
-
-
-
-
 // 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 StyleCompare
-ruleStyleCompare returns [Enumerator current=null] 
-    @init { enterRule(); }
-    @after { leaveRule(); }:
-((	enumLiteral_0='equal' 
-	{
-        $current = grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
-        newLeafNode(enumLiteral_0, grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0()); 
-    }
-)
-    |(	enumLiteral_1='greater equal' 
-	{
-        $current = grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
-        newLeafNode(enumLiteral_1, grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1()); 
-    }
-)
-    |(	enumLiteral_2='greater than' 
-	{
-        $current = grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
-        newLeafNode(enumLiteral_2, grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2()); 
-    }
-)
-    |(	enumLiteral_3='lower equal' 
-	{
-        $current = grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
-        newLeafNode(enumLiteral_3, grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3()); 
-    }
-)
-    |(	enumLiteral_4='lower than' 
-	{
-        $current = grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
-        newLeafNode(enumLiteral_4, grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4()); 
-    }
-)
-    |(	enumLiteral_5='not equal' 
-	{
-        $current = grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
-        newLeafNode(enumLiteral_5, grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5()); 
-    }
-));
-
-
+ruleStyleCompare returns [Enumerator current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			enumLiteral_0='equal'
+			{
+				$current = grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0());
+			}
+		)
+		    |
+		(
+			enumLiteral_1='greater equal'
+			{
+				$current = grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1());
+			}
+		)
+		    |
+		(
+			enumLiteral_2='greater than'
+			{
+				$current = grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2());
+			}
+		)
+		    |
+		(
+			enumLiteral_3='lower equal'
+			{
+				$current = grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3());
+			}
+		)
+		    |
+		(
+			enumLiteral_4='lower than'
+			{
+				$current = grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_4, grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4());
+			}
+		)
+		    |
+		(
+			enumLiteral_5='not equal'
+			{
+				$current = grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_5, grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5());
+			}
+		)
+	)
+;
 
 RULE_ID : '^'? ('a'..'z'|'A'..'Z'|'$'|'_') ('a'..'z'|'A'..'Z'|'$'|'_'|'0'..'9')*;
 
@@ -2709,5 +2725,3 @@
 RULE_WS : (' '|'\t'|'\r'|'\n')+;
 
 RULE_ANY_OTHER : .;
-
-
diff --git a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSourceLexer.java b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSourceLexer.java
index debae8b..b0c2e73 100644
--- a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSourceLexer.java
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSourceLexer.java
@@ -108,15 +108,15 @@
         super(input,state);
 
     }
-    public String getGrammarFileName() { return "../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g"; }
+    public String getGrammarFileName() { return "InternalGridSource.g"; }
 
     // $ANTLR start "T__13"
     public final void mT__13() throws RecognitionException {
         try {
             int _type = T__13;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:11:7: ( 'gridsource' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:11:9: 'gridsource'
+            // InternalGridSource.g:11:7: ( 'gridsource' )
+            // InternalGridSource.g:11:9: 'gridsource'
             {
             match("gridsource"); 
 
@@ -136,8 +136,8 @@
         try {
             int _type = T__14;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:12:7: ( 'for' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:12:9: 'for'
+            // InternalGridSource.g:12:7: ( 'for' )
+            // InternalGridSource.g:12:9: 'for'
             {
             match("for"); 
 
@@ -157,8 +157,8 @@
         try {
             int _type = T__15;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:13:7: ( '{' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:13:9: '{'
+            // InternalGridSource.g:13:7: ( '{' )
+            // InternalGridSource.g:13:9: '{'
             {
             match('{'); 
 
@@ -177,8 +177,8 @@
         try {
             int _type = T__16;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:14:7: ( 'inputs' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:14:9: 'inputs'
+            // InternalGridSource.g:14:7: ( 'inputs' )
+            // InternalGridSource.g:14:9: 'inputs'
             {
             match("inputs"); 
 
@@ -198,8 +198,8 @@
         try {
             int _type = T__17;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:15:7: ( '}' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:15:9: '}'
+            // InternalGridSource.g:15:7: ( '}' )
+            // InternalGridSource.g:15:9: '}'
             {
             match('}'); 
 
@@ -218,8 +218,8 @@
         try {
             int _type = T__18;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:16:7: ( 'inputType' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:16:9: 'inputType'
+            // InternalGridSource.g:16:7: ( 'inputType' )
+            // InternalGridSource.g:16:9: 'inputType'
             {
             match("inputType"); 
 
@@ -239,8 +239,8 @@
         try {
             int _type = T__19;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:17:7: ( 'filters' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:17:9: 'filters'
+            // InternalGridSource.g:17:7: ( 'filters' )
+            // InternalGridSource.g:17:9: 'filters'
             {
             match("filters"); 
 
@@ -260,8 +260,8 @@
         try {
             int _type = T__20;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:18:7: ( '&&' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:18:9: '&&'
+            // InternalGridSource.g:18:7: ( '&&' )
+            // InternalGridSource.g:18:9: '&&'
             {
             match("&&"); 
 
@@ -281,8 +281,8 @@
         try {
             int _type = T__21;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:19:7: ( 'root:' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:19:9: 'root:'
+            // InternalGridSource.g:19:7: ( 'root:' )
+            // InternalGridSource.g:19:9: 'root:'
             {
             match("root:"); 
 
@@ -302,8 +302,8 @@
         try {
             int _type = T__22;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:20:7: ( '=' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:20:9: '='
+            // InternalGridSource.g:20:7: ( '=' )
+            // InternalGridSource.g:20:9: '='
             {
             match('='); 
 
@@ -322,8 +322,8 @@
         try {
             int _type = T__23;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:21:7: ( 'input:' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:21:9: 'input:'
+            // InternalGridSource.g:21:7: ( 'input:' )
+            // InternalGridSource.g:21:9: 'input:'
             {
             match("input:"); 
 
@@ -343,8 +343,8 @@
         try {
             int _type = T__24;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:22:7: ( 'prop' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:22:9: 'prop'
+            // InternalGridSource.g:22:7: ( 'prop' )
+            // InternalGridSource.g:22:9: 'prop'
             {
             match("prop"); 
 
@@ -364,8 +364,8 @@
         try {
             int _type = T__25;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:23:7: ( 'style' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:23:9: 'style'
+            // InternalGridSource.g:23:7: ( 'style' )
+            // InternalGridSource.g:23:9: 'style'
             {
             match("style"); 
 
@@ -385,8 +385,8 @@
         try {
             int _type = T__26;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:24:7: ( '.' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:24:9: '.'
+            // InternalGridSource.g:24:7: ( '.' )
+            // InternalGridSource.g:24:9: '.'
             {
             match('.'); 
 
@@ -405,8 +405,8 @@
         try {
             int _type = T__27;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:25:7: ( 'buttonStyle' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:25:9: 'buttonStyle'
+            // InternalGridSource.g:25:7: ( 'buttonStyle' )
+            // InternalGridSource.g:25:9: 'buttonStyle'
             {
             match("buttonStyle"); 
 
@@ -426,8 +426,8 @@
         try {
             int _type = T__28;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:26:7: ( 'eventTopic' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:26:9: 'eventTopic'
+            // InternalGridSource.g:26:7: ( 'eventTopic' )
+            // InternalGridSource.g:26:9: 'eventTopic'
             {
             match("eventTopic"); 
 
@@ -447,8 +447,8 @@
         try {
             int _type = T__29;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:27:7: ( 'htmlStyle' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:27:9: 'htmlStyle'
+            // InternalGridSource.g:27:7: ( 'htmlStyle' )
+            // InternalGridSource.g:27:9: 'htmlStyle'
             {
             match("htmlStyle"); 
 
@@ -468,8 +468,8 @@
         try {
             int _type = T__30;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:28:7: ( 'boolStyle' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:28:9: 'boolStyle'
+            // InternalGridSource.g:28:7: ( 'boolStyle' )
+            // InternalGridSource.g:28:9: 'boolStyle'
             {
             match("boolStyle"); 
 
@@ -489,8 +489,8 @@
         try {
             int _type = T__31;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:29:7: ( 'dateStyle' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:29:9: 'dateStyle'
+            // InternalGridSource.g:29:7: ( 'dateStyle' )
+            // InternalGridSource.g:29:9: 'dateStyle'
             {
             match("dateStyle"); 
 
@@ -510,8 +510,8 @@
         try {
             int _type = T__32;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:30:7: ( 'format' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:30:9: 'format'
+            // InternalGridSource.g:30:7: ( 'format' )
+            // InternalGridSource.g:30:9: 'format'
             {
             match("format"); 
 
@@ -531,8 +531,8 @@
         try {
             int _type = T__33;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:31:7: ( 'numberStyle' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:31:9: 'numberStyle'
+            // InternalGridSource.g:31:7: ( 'numberStyle' )
+            // InternalGridSource.g:31:9: 'numberStyle'
             {
             match("numberStyle"); 
 
@@ -552,8 +552,8 @@
         try {
             int _type = T__34;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:32:7: ( 'progressbarStyle' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:32:9: 'progressbarStyle'
+            // InternalGridSource.g:32:7: ( 'progressbarStyle' )
+            // InternalGridSource.g:32:9: 'progressbarStyle'
             {
             match("progressbarStyle"); 
 
@@ -573,8 +573,8 @@
         try {
             int _type = T__35;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:33:7: ( 'max' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:33:9: 'max'
+            // InternalGridSource.g:33:7: ( 'max' )
+            // InternalGridSource.g:33:9: 'max'
             {
             match("max"); 
 
@@ -594,8 +594,8 @@
         try {
             int _type = T__36;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:34:7: ( 'indicatorStyle' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:34:9: 'indicatorStyle'
+            // InternalGridSource.g:34:7: ( 'indicatorStyle' )
+            // InternalGridSource.g:34:9: 'indicatorStyle'
             {
             match("indicatorStyle"); 
 
@@ -615,8 +615,8 @@
         try {
             int _type = T__37;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:35:7: ( 'greenFrom' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:35:9: 'greenFrom'
+            // InternalGridSource.g:35:7: ( 'greenFrom' )
+            // InternalGridSource.g:35:9: 'greenFrom'
             {
             match("greenFrom"); 
 
@@ -636,8 +636,8 @@
         try {
             int _type = T__38;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:36:7: ( 'redUntil' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:36:9: 'redUntil'
+            // InternalGridSource.g:36:7: ( 'redUntil' )
+            // InternalGridSource.g:36:9: 'redUntil'
             {
             match("redUntil"); 
 
@@ -657,8 +657,8 @@
         try {
             int _type = T__39;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:37:7: ( 'quantityStyle' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:37:9: 'quantityStyle'
+            // InternalGridSource.g:37:7: ( 'quantityStyle' )
+            // InternalGridSource.g:37:9: 'quantityStyle'
             {
             match("quantityStyle"); 
 
@@ -678,8 +678,8 @@
         try {
             int _type = T__40;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:38:7: ( 'value' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:38:9: 'value'
+            // InternalGridSource.g:38:7: ( 'value' )
+            // InternalGridSource.g:38:9: 'value'
             {
             match("value"); 
 
@@ -699,8 +699,8 @@
         try {
             int _type = T__41;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:39:7: ( '(' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:39:9: '('
+            // InternalGridSource.g:39:7: ( '(' )
+            // InternalGridSource.g:39:9: '('
             {
             match('('); 
 
@@ -719,8 +719,8 @@
         try {
             int _type = T__42;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:40:7: ( ')' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:40:9: ')'
+            // InternalGridSource.g:40:7: ( ')' )
+            // InternalGridSource.g:40:9: ')'
             {
             match(')'); 
 
@@ -739,8 +739,8 @@
         try {
             int _type = T__43;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:41:7: ( 'uom' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:41:9: 'uom'
+            // InternalGridSource.g:41:7: ( 'uom' )
+            // InternalGridSource.g:41:9: 'uom'
             {
             match("uom"); 
 
@@ -760,8 +760,8 @@
         try {
             int _type = T__44;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:42:7: ( 'priceStyle' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:42:9: 'priceStyle'
+            // InternalGridSource.g:42:7: ( 'priceStyle' )
+            // InternalGridSource.g:42:9: 'priceStyle'
             {
             match("priceStyle"); 
 
@@ -781,8 +781,8 @@
         try {
             int _type = T__45;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:43:7: ( 'currency' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:43:9: 'currency'
+            // InternalGridSource.g:43:7: ( 'currency' )
+            // InternalGridSource.g:43:9: 'currency'
             {
             match("currency"); 
 
@@ -802,8 +802,8 @@
         try {
             int _type = T__46;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:44:7: ( 'textStyle' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:44:9: 'textStyle'
+            // InternalGridSource.g:44:7: ( 'textStyle' )
+            // InternalGridSource.g:44:9: 'textStyle'
             {
             match("textStyle"); 
 
@@ -823,8 +823,8 @@
         try {
             int _type = T__47;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:45:7: ( 'imageStyle' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:45:9: 'imageStyle'
+            // InternalGridSource.g:45:7: ( 'imageStyle' )
+            // InternalGridSource.g:45:9: 'imageStyle'
             {
             match("imageStyle"); 
 
@@ -844,8 +844,8 @@
         try {
             int _type = T__48;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:46:7: ( 'number' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:46:9: 'number'
+            // InternalGridSource.g:46:7: ( 'number' )
+            // InternalGridSource.g:46:9: 'number'
             {
             match("number"); 
 
@@ -865,8 +865,8 @@
         try {
             int _type = T__49;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:47:7: ( 'then' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:47:9: 'then'
+            // InternalGridSource.g:47:7: ( 'then' )
+            // InternalGridSource.g:47:9: 'then'
             {
             match("then"); 
 
@@ -886,8 +886,8 @@
         try {
             int _type = T__50;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:48:7: ( 'string' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:48:9: 'string'
+            // InternalGridSource.g:48:7: ( 'string' )
+            // InternalGridSource.g:48:9: 'string'
             {
             match("string"); 
 
@@ -907,8 +907,8 @@
         try {
             int _type = T__51;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:49:7: ( '+' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:49:9: '+'
+            // InternalGridSource.g:49:7: ( '+' )
+            // InternalGridSource.g:49:9: '+'
             {
             match('+'); 
 
@@ -927,8 +927,8 @@
         try {
             int _type = T__52;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:50:7: ( '-' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:50:9: '-'
+            // InternalGridSource.g:50:7: ( '-' )
+            // InternalGridSource.g:50:9: '-'
             {
             match('-'); 
 
@@ -947,8 +947,8 @@
         try {
             int _type = T__53;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:51:7: ( '[' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:51:9: '['
+            // InternalGridSource.g:51:7: ( '[' )
+            // InternalGridSource.g:51:9: '['
             {
             match('['); 
 
@@ -967,8 +967,8 @@
         try {
             int _type = T__54;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:52:7: ( ']' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:52:9: ']'
+            // InternalGridSource.g:52:7: ( ']' )
+            // InternalGridSource.g:52:9: ']'
             {
             match(']'); 
 
@@ -987,8 +987,8 @@
         try {
             int _type = T__55;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:53:7: ( ',' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:53:9: ','
+            // InternalGridSource.g:53:7: ( ',' )
+            // InternalGridSource.g:53:9: ','
             {
             match(','); 
 
@@ -1007,8 +1007,8 @@
         try {
             int _type = T__56;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:54:7: ( '=>' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:54:9: '=>'
+            // InternalGridSource.g:54:7: ( '=>' )
+            // InternalGridSource.g:54:9: '=>'
             {
             match("=>"); 
 
@@ -1028,8 +1028,8 @@
         try {
             int _type = T__57;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:55:7: ( '<' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:55:9: '<'
+            // InternalGridSource.g:55:7: ( '<' )
+            // InternalGridSource.g:55:9: '<'
             {
             match('<'); 
 
@@ -1048,8 +1048,8 @@
         try {
             int _type = T__58;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:56:7: ( '>' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:56:9: '>'
+            // InternalGridSource.g:56:7: ( '>' )
+            // InternalGridSource.g:56:9: '>'
             {
             match('>'); 
 
@@ -1068,8 +1068,8 @@
         try {
             int _type = T__59;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:57:7: ( '?' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:57:9: '?'
+            // InternalGridSource.g:57:7: ( '?' )
+            // InternalGridSource.g:57:9: '?'
             {
             match('?'); 
 
@@ -1088,8 +1088,8 @@
         try {
             int _type = T__60;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:58:7: ( 'extends' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:58:9: 'extends'
+            // InternalGridSource.g:58:7: ( 'extends' )
+            // InternalGridSource.g:58:9: 'extends'
             {
             match("extends"); 
 
@@ -1109,8 +1109,8 @@
         try {
             int _type = T__61;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:59:7: ( '&' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:59:9: '&'
+            // InternalGridSource.g:59:7: ( '&' )
+            // InternalGridSource.g:59:9: '&'
             {
             match('&'); 
 
@@ -1129,8 +1129,8 @@
         try {
             int _type = T__62;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:60:7: ( 'super' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:60:9: 'super'
+            // InternalGridSource.g:60:7: ( 'super' )
+            // InternalGridSource.g:60:9: 'super'
             {
             match("super"); 
 
@@ -1150,8 +1150,8 @@
         try {
             int _type = T__63;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:61:7: ( '*' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:61:9: '*'
+            // InternalGridSource.g:61:7: ( '*' )
+            // InternalGridSource.g:61:9: '*'
             {
             match('*'); 
 
@@ -1170,8 +1170,8 @@
         try {
             int _type = T__64;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:62:7: ( 'import' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:62:9: 'import'
+            // InternalGridSource.g:62:7: ( 'import' )
+            // InternalGridSource.g:62:9: 'import'
             {
             match("import"); 
 
@@ -1191,8 +1191,8 @@
         try {
             int _type = T__65;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:63:7: ( 'static' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:63:9: 'static'
+            // InternalGridSource.g:63:7: ( 'static' )
+            // InternalGridSource.g:63:9: 'static'
             {
             match("static"); 
 
@@ -1212,8 +1212,8 @@
         try {
             int _type = T__66;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:64:7: ( 'extension' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:64:9: 'extension'
+            // InternalGridSource.g:64:7: ( 'extension' )
+            // InternalGridSource.g:64:9: 'extension'
             {
             match("extension"); 
 
@@ -1233,8 +1233,8 @@
         try {
             int _type = T__67;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:65:7: ( ';' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:65:9: ';'
+            // InternalGridSource.g:65:7: ( ';' )
+            // InternalGridSource.g:65:9: ';'
             {
             match(';'); 
 
@@ -1253,8 +1253,8 @@
         try {
             int _type = T__68;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:66:7: ( 'equal' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:66:9: 'equal'
+            // InternalGridSource.g:66:7: ( 'equal' )
+            // InternalGridSource.g:66:9: 'equal'
             {
             match("equal"); 
 
@@ -1274,8 +1274,8 @@
         try {
             int _type = T__69;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:67:7: ( 'greater equal' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:67:9: 'greater equal'
+            // InternalGridSource.g:67:7: ( 'greater equal' )
+            // InternalGridSource.g:67:9: 'greater equal'
             {
             match("greater equal"); 
 
@@ -1295,8 +1295,8 @@
         try {
             int _type = T__70;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:68:7: ( 'greater than' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:68:9: 'greater than'
+            // InternalGridSource.g:68:7: ( 'greater than' )
+            // InternalGridSource.g:68:9: 'greater than'
             {
             match("greater than"); 
 
@@ -1316,8 +1316,8 @@
         try {
             int _type = T__71;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:69:7: ( 'lower equal' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:69:9: 'lower equal'
+            // InternalGridSource.g:69:7: ( 'lower equal' )
+            // InternalGridSource.g:69:9: 'lower equal'
             {
             match("lower equal"); 
 
@@ -1337,8 +1337,8 @@
         try {
             int _type = T__72;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:70:7: ( 'lower than' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:70:9: 'lower than'
+            // InternalGridSource.g:70:7: ( 'lower than' )
+            // InternalGridSource.g:70:9: 'lower than'
             {
             match("lower than"); 
 
@@ -1358,8 +1358,8 @@
         try {
             int _type = T__73;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:71:7: ( 'not equal' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:71:9: 'not equal'
+            // InternalGridSource.g:71:7: ( 'not equal' )
+            // InternalGridSource.g:71:9: 'not equal'
             {
             match("not equal"); 
 
@@ -1379,10 +1379,10 @@
         try {
             int _type = RULE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2685:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2685:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            // InternalGridSource.g:2711:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
+            // InternalGridSource.g:2711:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2685:11: ( '^' )?
+            // InternalGridSource.g:2711:11: ( '^' )?
             int alt1=2;
             int LA1_0 = input.LA(1);
 
@@ -1391,7 +1391,7 @@
             }
             switch (alt1) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2685:11: '^'
+                    // InternalGridSource.g:2711:11: '^'
                     {
                     match('^'); 
 
@@ -1409,7 +1409,7 @@
                 recover(mse);
                 throw mse;}
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2685:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            // InternalGridSource.g:2711:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
             loop2:
             do {
                 int alt2=2;
@@ -1422,7 +1422,7 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:
+            	    // InternalGridSource.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();
@@ -1458,11 +1458,11 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2687:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2687:12: '0' .. '9' ( '0' .. '9' | '_' )*
+            // InternalGridSource.g:2713:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
+            // InternalGridSource.g:2713:12: '0' .. '9' ( '0' .. '9' | '_' )*
             {
             matchRange('0','9'); 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2687:21: ( '0' .. '9' | '_' )*
+            // InternalGridSource.g:2713:21: ( '0' .. '9' | '_' )*
             loop3:
             do {
                 int alt3=2;
@@ -1475,7 +1475,7 @@
 
                 switch (alt3) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:
+            	    // InternalGridSource.g:
             	    {
             	    if ( (input.LA(1)>='0' && input.LA(1)<='9')||input.LA(1)=='_' ) {
             	        input.consume();
@@ -1511,12 +1511,12 @@
         try {
             int _type = RULE_THEME_RESOURCE;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2689:21: ( 'theme:/' ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '.' | '/' | '0' .. '9' )* )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2689:23: 'theme:/' ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '.' | '/' | '0' .. '9' )*
+            // InternalGridSource.g:2715:21: ( 'theme:/' ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '.' | '/' | '0' .. '9' )* )
+            // InternalGridSource.g:2715:23: 'theme:/' ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '.' | '/' | '0' .. '9' )*
             {
             match("theme:/"); 
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2689:33: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '.' | '/' | '0' .. '9' )*
+            // InternalGridSource.g:2715:33: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '.' | '/' | '0' .. '9' )*
             loop4:
             do {
                 int alt4=2;
@@ -1529,7 +1529,7 @@
 
                 switch (alt4) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:
+            	    // InternalGridSource.g:
             	    {
             	    if ( input.LA(1)=='$'||(input.LA(1)>='.' && 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();
@@ -1565,12 +1565,12 @@
         try {
             int _type = RULE_EVENT_TOPIC;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2691:18: ( '\\'' RULE_ID ( '/' RULE_ID )* ( '/*' )? '\\'' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2691:20: '\\'' RULE_ID ( '/' RULE_ID )* ( '/*' )? '\\''
+            // InternalGridSource.g:2717:18: ( '\\'' RULE_ID ( '/' RULE_ID )* ( '/*' )? '\\'' )
+            // InternalGridSource.g:2717:20: '\\'' RULE_ID ( '/' RULE_ID )* ( '/*' )? '\\''
             {
             match('\''); 
             mRULE_ID(); 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2691:33: ( '/' RULE_ID )*
+            // InternalGridSource.g:2717:33: ( '/' RULE_ID )*
             loop5:
             do {
                 int alt5=2;
@@ -1589,7 +1589,7 @@
 
                 switch (alt5) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2691:34: '/' RULE_ID
+            	    // InternalGridSource.g:2717:34: '/' RULE_ID
             	    {
             	    match('/'); 
             	    mRULE_ID(); 
@@ -1602,7 +1602,7 @@
                 }
             } while (true);
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2691:48: ( '/*' )?
+            // InternalGridSource.g:2717:48: ( '/*' )?
             int alt6=2;
             int LA6_0 = input.LA(1);
 
@@ -1611,7 +1611,7 @@
             }
             switch (alt6) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2691:48: '/*'
+                    // InternalGridSource.g:2717:48: '/*'
                     {
                     match("/*"); 
 
@@ -1638,10 +1638,10 @@
         try {
             int _type = RULE_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalGridSource.g:2719:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
+            // InternalGridSource.g:2719:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalGridSource.g:2719:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             int alt11=2;
             int LA11_0 = input.LA(1);
 
@@ -1659,10 +1659,10 @@
             }
             switch (alt11) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
+                    // InternalGridSource.g:2719:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
                     {
                     match('\"'); 
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    // InternalGridSource.g:2719:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
                     loop7:
                     do {
                         int alt7=3;
@@ -1678,7 +1678,7 @@
 
                         switch (alt7) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:21: '\\\\' .
+                    	    // InternalGridSource.g:2719:21: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -1686,7 +1686,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    // InternalGridSource.g:2719:28: ~ ( ( '\\\\' | '\"' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -1706,7 +1706,7 @@
                         }
                     } while (true);
 
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:44: ( '\"' )?
+                    // InternalGridSource.g:2719:44: ( '\"' )?
                     int alt8=2;
                     int LA8_0 = input.LA(1);
 
@@ -1715,7 +1715,7 @@
                     }
                     switch (alt8) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:44: '\"'
+                            // InternalGridSource.g:2719:44: '\"'
                             {
                             match('\"'); 
 
@@ -1728,10 +1728,10 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
+                    // InternalGridSource.g:2719:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
                     {
                     match('\''); 
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    // InternalGridSource.g:2719:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
                     loop9:
                     do {
                         int alt9=3;
@@ -1747,7 +1747,7 @@
 
                         switch (alt9) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:55: '\\\\' .
+                    	    // InternalGridSource.g:2719:55: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -1755,7 +1755,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:62: ~ ( ( '\\\\' | '\\'' ) )
+                    	    // InternalGridSource.g:2719:62: ~ ( ( '\\\\' | '\\'' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -1775,7 +1775,7 @@
                         }
                     } while (true);
 
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:79: ( '\\'' )?
+                    // InternalGridSource.g:2719:79: ( '\\'' )?
                     int alt10=2;
                     int LA10_0 = input.LA(1);
 
@@ -1784,7 +1784,7 @@
                     }
                     switch (alt10) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:79: '\\''
+                            // InternalGridSource.g:2719:79: '\\''
                             {
                             match('\''); 
 
@@ -1815,12 +1815,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2695:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2695:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalGridSource.g:2721:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalGridSource.g:2721:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*"); 
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2695:24: ( options {greedy=false; } : . )*
+            // InternalGridSource.g:2721:24: ( options {greedy=false; } : . )*
             loop12:
             do {
                 int alt12=2;
@@ -1845,7 +1845,7 @@
 
                 switch (alt12) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2695:52: .
+            	    // InternalGridSource.g:2721:52: .
             	    {
             	    matchAny(); 
 
@@ -1875,12 +1875,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2697:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2697:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalGridSource.g:2723:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalGridSource.g:2723:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("//"); 
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2697:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalGridSource.g:2723:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop13:
             do {
                 int alt13=2;
@@ -1893,7 +1893,7 @@
 
                 switch (alt13) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2697:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalGridSource.g:2723: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();
@@ -1913,7 +1913,7 @@
                 }
             } while (true);
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2697:40: ( ( '\\r' )? '\\n' )?
+            // InternalGridSource.g:2723:40: ( ( '\\r' )? '\\n' )?
             int alt15=2;
             int LA15_0 = input.LA(1);
 
@@ -1922,9 +1922,9 @@
             }
             switch (alt15) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2697:41: ( '\\r' )? '\\n'
+                    // InternalGridSource.g:2723:41: ( '\\r' )? '\\n'
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2697:41: ( '\\r' )?
+                    // InternalGridSource.g:2723:41: ( '\\r' )?
                     int alt14=2;
                     int LA14_0 = input.LA(1);
 
@@ -1933,7 +1933,7 @@
                     }
                     switch (alt14) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2697:41: '\\r'
+                            // InternalGridSource.g:2723:41: '\\r'
                             {
                             match('\r'); 
 
@@ -1965,10 +1965,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2699:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2699:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalGridSource.g:2725:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalGridSource.g:2725:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2699:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalGridSource.g:2725:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt16=0;
             loop16:
             do {
@@ -1982,7 +1982,7 @@
 
                 switch (alt16) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:
+            	    // InternalGridSource.g:
             	    {
             	    if ( (input.LA(1)>='\t' && input.LA(1)<='\n')||input.LA(1)=='\r'||input.LA(1)==' ' ) {
             	        input.consume();
@@ -2022,8 +2022,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2701:16: ( . )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2701:18: .
+            // InternalGridSource.g:2727:16: ( . )
+            // InternalGridSource.g:2727:18: .
             {
             matchAny(); 
 
@@ -2038,495 +2038,495 @@
     // $ANTLR end "RULE_ANY_OTHER"
 
     public void mTokens() throws RecognitionException {
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.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 | RULE_ID | RULE_INT | RULE_THEME_RESOURCE | RULE_EVENT_TOPIC | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        // InternalGridSource.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 | RULE_ID | RULE_INT | RULE_THEME_RESOURCE | RULE_EVENT_TOPIC | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
         int alt17=70;
         alt17 = dfa17.predict(input);
         switch (alt17) {
             case 1 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:10: T__13
+                // InternalGridSource.g:1:10: T__13
                 {
                 mT__13(); 
 
                 }
                 break;
             case 2 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:16: T__14
+                // InternalGridSource.g:1:16: T__14
                 {
                 mT__14(); 
 
                 }
                 break;
             case 3 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:22: T__15
+                // InternalGridSource.g:1:22: T__15
                 {
                 mT__15(); 
 
                 }
                 break;
             case 4 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:28: T__16
+                // InternalGridSource.g:1:28: T__16
                 {
                 mT__16(); 
 
                 }
                 break;
             case 5 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:34: T__17
+                // InternalGridSource.g:1:34: T__17
                 {
                 mT__17(); 
 
                 }
                 break;
             case 6 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:40: T__18
+                // InternalGridSource.g:1:40: T__18
                 {
                 mT__18(); 
 
                 }
                 break;
             case 7 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:46: T__19
+                // InternalGridSource.g:1:46: T__19
                 {
                 mT__19(); 
 
                 }
                 break;
             case 8 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:52: T__20
+                // InternalGridSource.g:1:52: T__20
                 {
                 mT__20(); 
 
                 }
                 break;
             case 9 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:58: T__21
+                // InternalGridSource.g:1:58: T__21
                 {
                 mT__21(); 
 
                 }
                 break;
             case 10 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:64: T__22
+                // InternalGridSource.g:1:64: T__22
                 {
                 mT__22(); 
 
                 }
                 break;
             case 11 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:70: T__23
+                // InternalGridSource.g:1:70: T__23
                 {
                 mT__23(); 
 
                 }
                 break;
             case 12 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:76: T__24
+                // InternalGridSource.g:1:76: T__24
                 {
                 mT__24(); 
 
                 }
                 break;
             case 13 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:82: T__25
+                // InternalGridSource.g:1:82: T__25
                 {
                 mT__25(); 
 
                 }
                 break;
             case 14 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:88: T__26
+                // InternalGridSource.g:1:88: T__26
                 {
                 mT__26(); 
 
                 }
                 break;
             case 15 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:94: T__27
+                // InternalGridSource.g:1:94: T__27
                 {
                 mT__27(); 
 
                 }
                 break;
             case 16 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:100: T__28
+                // InternalGridSource.g:1:100: T__28
                 {
                 mT__28(); 
 
                 }
                 break;
             case 17 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:106: T__29
+                // InternalGridSource.g:1:106: T__29
                 {
                 mT__29(); 
 
                 }
                 break;
             case 18 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:112: T__30
+                // InternalGridSource.g:1:112: T__30
                 {
                 mT__30(); 
 
                 }
                 break;
             case 19 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:118: T__31
+                // InternalGridSource.g:1:118: T__31
                 {
                 mT__31(); 
 
                 }
                 break;
             case 20 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:124: T__32
+                // InternalGridSource.g:1:124: T__32
                 {
                 mT__32(); 
 
                 }
                 break;
             case 21 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:130: T__33
+                // InternalGridSource.g:1:130: T__33
                 {
                 mT__33(); 
 
                 }
                 break;
             case 22 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:136: T__34
+                // InternalGridSource.g:1:136: T__34
                 {
                 mT__34(); 
 
                 }
                 break;
             case 23 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:142: T__35
+                // InternalGridSource.g:1:142: T__35
                 {
                 mT__35(); 
 
                 }
                 break;
             case 24 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:148: T__36
+                // InternalGridSource.g:1:148: T__36
                 {
                 mT__36(); 
 
                 }
                 break;
             case 25 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:154: T__37
+                // InternalGridSource.g:1:154: T__37
                 {
                 mT__37(); 
 
                 }
                 break;
             case 26 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:160: T__38
+                // InternalGridSource.g:1:160: T__38
                 {
                 mT__38(); 
 
                 }
                 break;
             case 27 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:166: T__39
+                // InternalGridSource.g:1:166: T__39
                 {
                 mT__39(); 
 
                 }
                 break;
             case 28 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:172: T__40
+                // InternalGridSource.g:1:172: T__40
                 {
                 mT__40(); 
 
                 }
                 break;
             case 29 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:178: T__41
+                // InternalGridSource.g:1:178: T__41
                 {
                 mT__41(); 
 
                 }
                 break;
             case 30 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:184: T__42
+                // InternalGridSource.g:1:184: T__42
                 {
                 mT__42(); 
 
                 }
                 break;
             case 31 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:190: T__43
+                // InternalGridSource.g:1:190: T__43
                 {
                 mT__43(); 
 
                 }
                 break;
             case 32 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:196: T__44
+                // InternalGridSource.g:1:196: T__44
                 {
                 mT__44(); 
 
                 }
                 break;
             case 33 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:202: T__45
+                // InternalGridSource.g:1:202: T__45
                 {
                 mT__45(); 
 
                 }
                 break;
             case 34 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:208: T__46
+                // InternalGridSource.g:1:208: T__46
                 {
                 mT__46(); 
 
                 }
                 break;
             case 35 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:214: T__47
+                // InternalGridSource.g:1:214: T__47
                 {
                 mT__47(); 
 
                 }
                 break;
             case 36 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:220: T__48
+                // InternalGridSource.g:1:220: T__48
                 {
                 mT__48(); 
 
                 }
                 break;
             case 37 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:226: T__49
+                // InternalGridSource.g:1:226: T__49
                 {
                 mT__49(); 
 
                 }
                 break;
             case 38 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:232: T__50
+                // InternalGridSource.g:1:232: T__50
                 {
                 mT__50(); 
 
                 }
                 break;
             case 39 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:238: T__51
+                // InternalGridSource.g:1:238: T__51
                 {
                 mT__51(); 
 
                 }
                 break;
             case 40 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:244: T__52
+                // InternalGridSource.g:1:244: T__52
                 {
                 mT__52(); 
 
                 }
                 break;
             case 41 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:250: T__53
+                // InternalGridSource.g:1:250: T__53
                 {
                 mT__53(); 
 
                 }
                 break;
             case 42 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:256: T__54
+                // InternalGridSource.g:1:256: T__54
                 {
                 mT__54(); 
 
                 }
                 break;
             case 43 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:262: T__55
+                // InternalGridSource.g:1:262: T__55
                 {
                 mT__55(); 
 
                 }
                 break;
             case 44 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:268: T__56
+                // InternalGridSource.g:1:268: T__56
                 {
                 mT__56(); 
 
                 }
                 break;
             case 45 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:274: T__57
+                // InternalGridSource.g:1:274: T__57
                 {
                 mT__57(); 
 
                 }
                 break;
             case 46 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:280: T__58
+                // InternalGridSource.g:1:280: T__58
                 {
                 mT__58(); 
 
                 }
                 break;
             case 47 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:286: T__59
+                // InternalGridSource.g:1:286: T__59
                 {
                 mT__59(); 
 
                 }
                 break;
             case 48 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:292: T__60
+                // InternalGridSource.g:1:292: T__60
                 {
                 mT__60(); 
 
                 }
                 break;
             case 49 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:298: T__61
+                // InternalGridSource.g:1:298: T__61
                 {
                 mT__61(); 
 
                 }
                 break;
             case 50 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:304: T__62
+                // InternalGridSource.g:1:304: T__62
                 {
                 mT__62(); 
 
                 }
                 break;
             case 51 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:310: T__63
+                // InternalGridSource.g:1:310: T__63
                 {
                 mT__63(); 
 
                 }
                 break;
             case 52 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:316: T__64
+                // InternalGridSource.g:1:316: T__64
                 {
                 mT__64(); 
 
                 }
                 break;
             case 53 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:322: T__65
+                // InternalGridSource.g:1:322: T__65
                 {
                 mT__65(); 
 
                 }
                 break;
             case 54 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:328: T__66
+                // InternalGridSource.g:1:328: T__66
                 {
                 mT__66(); 
 
                 }
                 break;
             case 55 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:334: T__67
+                // InternalGridSource.g:1:334: T__67
                 {
                 mT__67(); 
 
                 }
                 break;
             case 56 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:340: T__68
+                // InternalGridSource.g:1:340: T__68
                 {
                 mT__68(); 
 
                 }
                 break;
             case 57 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:346: T__69
+                // InternalGridSource.g:1:346: T__69
                 {
                 mT__69(); 
 
                 }
                 break;
             case 58 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:352: T__70
+                // InternalGridSource.g:1:352: T__70
                 {
                 mT__70(); 
 
                 }
                 break;
             case 59 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:358: T__71
+                // InternalGridSource.g:1:358: T__71
                 {
                 mT__71(); 
 
                 }
                 break;
             case 60 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:364: T__72
+                // InternalGridSource.g:1:364: T__72
                 {
                 mT__72(); 
 
                 }
                 break;
             case 61 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:370: T__73
+                // InternalGridSource.g:1:370: T__73
                 {
                 mT__73(); 
 
                 }
                 break;
             case 62 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:376: RULE_ID
+                // InternalGridSource.g:1:376: RULE_ID
                 {
                 mRULE_ID(); 
 
                 }
                 break;
             case 63 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:384: RULE_INT
+                // InternalGridSource.g:1:384: RULE_INT
                 {
                 mRULE_INT(); 
 
                 }
                 break;
             case 64 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:393: RULE_THEME_RESOURCE
+                // InternalGridSource.g:1:393: RULE_THEME_RESOURCE
                 {
                 mRULE_THEME_RESOURCE(); 
 
                 }
                 break;
             case 65 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:413: RULE_EVENT_TOPIC
+                // InternalGridSource.g:1:413: RULE_EVENT_TOPIC
                 {
                 mRULE_EVENT_TOPIC(); 
 
                 }
                 break;
             case 66 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:430: RULE_STRING
+                // InternalGridSource.g:1:430: RULE_STRING
                 {
                 mRULE_STRING(); 
 
                 }
                 break;
             case 67 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:442: RULE_ML_COMMENT
+                // InternalGridSource.g:1:442: RULE_ML_COMMENT
                 {
                 mRULE_ML_COMMENT(); 
 
                 }
                 break;
             case 68 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:458: RULE_SL_COMMENT
+                // InternalGridSource.g:1:458: RULE_SL_COMMENT
                 {
                 mRULE_SL_COMMENT(); 
 
                 }
                 break;
             case 69 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:474: RULE_WS
+                // InternalGridSource.g:1:474: RULE_WS
                 {
                 mRULE_WS(); 
 
                 }
                 break;
             case 70 :
-                // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1:482: RULE_ANY_OTHER
+                // InternalGridSource.g:1:482: RULE_ANY_OTHER
                 {
                 mRULE_ANY_OTHER(); 
 
diff --git a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSourceParser.java b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSourceParser.java
index b5904aa..e2bdcfe 100644
--- a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSourceParser.java
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSourceParser.java
@@ -1,17 +1,4 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
- */
-package org.eclipse.osbp.xtext.gridsource.parser.antlr.internal; 
+package org.eclipse.osbp.xtext.gridsource.parser.antlr.internal;
 
 import org.eclipse.xtext.*;
 import org.eclipse.xtext.parser.*;
@@ -124,23 +111,23 @@
         
 
     public String[] getTokenNames() { return InternalGridSourceParser.tokenNames; }
-    public String getGrammarFileName() { return "../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g"; }
+    public String getGrammarFileName() { return "InternalGridSource.g"; }
 
 
 
      	private GridSourceGrammarAccess grammarAccess;
-     	
+
         public InternalGridSourceParser(TokenStream input, GridSourceGrammarAccess grammarAccess) {
             this(input);
             this.grammarAccess = grammarAccess;
             registerRules(grammarAccess.getGrammar());
         }
-        
+
         @Override
         protected String getFirstRuleName() {
-        	return "Source";	
+        	return "Source";
        	}
-       	
+
        	@Override
        	protected GridSourceGrammarAccess getGrammarAccess() {
        		return grammarAccess;
@@ -148,8 +135,9 @@
 
 
 
+
     // $ANTLR start "entryRuleSource"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:68:1: entryRuleSource returns [EObject current=null] : iv_ruleSource= ruleSource EOF ;
+    // InternalGridSource.g:65:1: entryRuleSource returns [EObject current=null] : iv_ruleSource= ruleSource EOF ;
     public final EObject entryRuleSource() throws RecognitionException {
         EObject current = null;
 
@@ -157,13 +145,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:69:2: (iv_ruleSource= ruleSource EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:70:2: iv_ruleSource= ruleSource EOF
+            // InternalGridSource.g:65:47: (iv_ruleSource= ruleSource EOF )
+            // InternalGridSource.g:66:2: iv_ruleSource= ruleSource EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getSourceRule()); 
             }
-            pushFollow(FOLLOW_ruleSource_in_entryRuleSource75);
+            pushFollow(FOLLOW_1);
             iv_ruleSource=ruleSource();
 
             state._fsp--;
@@ -171,16 +159,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleSource; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleSource85); 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;
@@ -189,7 +177,7 @@
 
 
     // $ANTLR start "ruleSource"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:77:1: ruleSource returns [EObject current=null] : (otherlv_0= 'gridsource' ( (lv_id_1_0= ruleQualifiedName ) ) otherlv_2= 'for' ( (lv_rootType_3_0= ruleJvmTypeReference ) ) otherlv_4= '{' otherlv_5= 'inputs' otherlv_6= '{' ( (lv_inputs_7_0= ruleInput ) )* otherlv_8= '}' ( (lv_properties_9_0= ruleProperty ) )* otherlv_10= '}' ) ;
+    // InternalGridSource.g:72:1: ruleSource returns [EObject current=null] : (otherlv_0= 'gridsource' ( (lv_id_1_0= ruleQualifiedName ) ) otherlv_2= 'for' ( (lv_rootType_3_0= ruleJvmTypeReference ) ) otherlv_4= '{' otherlv_5= 'inputs' otherlv_6= '{' ( (lv_inputs_7_0= ruleInput ) )* otherlv_8= '}' ( (lv_properties_9_0= ruleProperty ) )* otherlv_10= '}' ) ;
     public final EObject ruleSource() throws RecognitionException {
         EObject current = null;
 
@@ -209,49 +197,50 @@
         EObject lv_properties_9_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:80:28: ( (otherlv_0= 'gridsource' ( (lv_id_1_0= ruleQualifiedName ) ) otherlv_2= 'for' ( (lv_rootType_3_0= ruleJvmTypeReference ) ) otherlv_4= '{' otherlv_5= 'inputs' otherlv_6= '{' ( (lv_inputs_7_0= ruleInput ) )* otherlv_8= '}' ( (lv_properties_9_0= ruleProperty ) )* otherlv_10= '}' ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:81:1: (otherlv_0= 'gridsource' ( (lv_id_1_0= ruleQualifiedName ) ) otherlv_2= 'for' ( (lv_rootType_3_0= ruleJvmTypeReference ) ) otherlv_4= '{' otherlv_5= 'inputs' otherlv_6= '{' ( (lv_inputs_7_0= ruleInput ) )* otherlv_8= '}' ( (lv_properties_9_0= ruleProperty ) )* otherlv_10= '}' )
+            // InternalGridSource.g:78:2: ( (otherlv_0= 'gridsource' ( (lv_id_1_0= ruleQualifiedName ) ) otherlv_2= 'for' ( (lv_rootType_3_0= ruleJvmTypeReference ) ) otherlv_4= '{' otherlv_5= 'inputs' otherlv_6= '{' ( (lv_inputs_7_0= ruleInput ) )* otherlv_8= '}' ( (lv_properties_9_0= ruleProperty ) )* otherlv_10= '}' ) )
+            // InternalGridSource.g:79:2: (otherlv_0= 'gridsource' ( (lv_id_1_0= ruleQualifiedName ) ) otherlv_2= 'for' ( (lv_rootType_3_0= ruleJvmTypeReference ) ) otherlv_4= '{' otherlv_5= 'inputs' otherlv_6= '{' ( (lv_inputs_7_0= ruleInput ) )* otherlv_8= '}' ( (lv_properties_9_0= ruleProperty ) )* otherlv_10= '}' )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:81:1: (otherlv_0= 'gridsource' ( (lv_id_1_0= ruleQualifiedName ) ) otherlv_2= 'for' ( (lv_rootType_3_0= ruleJvmTypeReference ) ) otherlv_4= '{' otherlv_5= 'inputs' otherlv_6= '{' ( (lv_inputs_7_0= ruleInput ) )* otherlv_8= '}' ( (lv_properties_9_0= ruleProperty ) )* otherlv_10= '}' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:81:3: otherlv_0= 'gridsource' ( (lv_id_1_0= ruleQualifiedName ) ) otherlv_2= 'for' ( (lv_rootType_3_0= ruleJvmTypeReference ) ) otherlv_4= '{' otherlv_5= 'inputs' otherlv_6= '{' ( (lv_inputs_7_0= ruleInput ) )* otherlv_8= '}' ( (lv_properties_9_0= ruleProperty ) )* otherlv_10= '}'
+            // InternalGridSource.g:79:2: (otherlv_0= 'gridsource' ( (lv_id_1_0= ruleQualifiedName ) ) otherlv_2= 'for' ( (lv_rootType_3_0= ruleJvmTypeReference ) ) otherlv_4= '{' otherlv_5= 'inputs' otherlv_6= '{' ( (lv_inputs_7_0= ruleInput ) )* otherlv_8= '}' ( (lv_properties_9_0= ruleProperty ) )* otherlv_10= '}' )
+            // InternalGridSource.g:80:3: otherlv_0= 'gridsource' ( (lv_id_1_0= ruleQualifiedName ) ) otherlv_2= 'for' ( (lv_rootType_3_0= ruleJvmTypeReference ) ) otherlv_4= '{' otherlv_5= 'inputs' otherlv_6= '{' ( (lv_inputs_7_0= ruleInput ) )* otherlv_8= '}' ( (lv_properties_9_0= ruleProperty ) )* otherlv_10= '}'
             {
-            otherlv_0=(Token)match(input,13,FOLLOW_13_in_ruleSource122); 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.getSourceAccess().getGridsourceKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getSourceAccess().getGridsourceKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:85:1: ( (lv_id_1_0= ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:86:1: (lv_id_1_0= ruleQualifiedName )
+            // InternalGridSource.g:84:3: ( (lv_id_1_0= ruleQualifiedName ) )
+            // InternalGridSource.g:85:4: (lv_id_1_0= ruleQualifiedName )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:86:1: (lv_id_1_0= ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:87:3: lv_id_1_0= ruleQualifiedName
+            // InternalGridSource.g:85:4: (lv_id_1_0= ruleQualifiedName )
+            // InternalGridSource.g:86:5: lv_id_1_0= ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getSourceAccess().getIdQualifiedNameParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getSourceAccess().getIdQualifiedNameParserRuleCall_1_0());
+              				
             }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleSource143);
+            pushFollow(FOLLOW_4);
             lv_id_1_0=ruleQualifiedName();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getSourceRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"id",
-                      		lv_id_1_0, 
-                      		"QualifiedName");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSourceRule());
+              					}
+              					set(
+              						current,
+              						"id",
+              						lv_id_1_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.QualifiedName");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -259,40 +248,40 @@
 
             }
 
-            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleSource155); if (state.failed) return current;
+            otherlv_2=(Token)match(input,14,FOLLOW_5); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getSourceAccess().getForKeyword_2());
-                  
+              			newLeafNode(otherlv_2, grammarAccess.getSourceAccess().getForKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:107:1: ( (lv_rootType_3_0= ruleJvmTypeReference ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:108:1: (lv_rootType_3_0= ruleJvmTypeReference )
+            // InternalGridSource.g:107:3: ( (lv_rootType_3_0= ruleJvmTypeReference ) )
+            // InternalGridSource.g:108:4: (lv_rootType_3_0= ruleJvmTypeReference )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:108:1: (lv_rootType_3_0= ruleJvmTypeReference )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:109:3: lv_rootType_3_0= ruleJvmTypeReference
+            // InternalGridSource.g:108:4: (lv_rootType_3_0= ruleJvmTypeReference )
+            // InternalGridSource.g:109:5: lv_rootType_3_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getSourceAccess().getRootTypeJvmTypeReferenceParserRuleCall_3_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getSourceAccess().getRootTypeJvmTypeReferenceParserRuleCall_3_0());
+              				
             }
-            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleSource176);
+            pushFollow(FOLLOW_6);
             lv_rootType_3_0=ruleJvmTypeReference();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getSourceRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"rootType",
-                      		lv_rootType_3_0, 
-                      		"JvmTypeReference");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getSourceRule());
+              					}
+              					set(
+              						current,
+              						"rootType",
+              						lv_rootType_3_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -300,25 +289,25 @@
 
             }
 
-            otherlv_4=(Token)match(input,15,FOLLOW_15_in_ruleSource188); if (state.failed) return current;
+            otherlv_4=(Token)match(input,15,FOLLOW_7); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_4, grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_4());
-                  
+              			newLeafNode(otherlv_4, grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_4());
+              		
             }
-            otherlv_5=(Token)match(input,16,FOLLOW_16_in_ruleSource200); if (state.failed) return current;
+            otherlv_5=(Token)match(input,16,FOLLOW_6); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_5, grammarAccess.getSourceAccess().getInputsKeyword_5());
-                  
+              			newLeafNode(otherlv_5, grammarAccess.getSourceAccess().getInputsKeyword_5());
+              		
             }
-            otherlv_6=(Token)match(input,15,FOLLOW_15_in_ruleSource212); if (state.failed) return current;
+            otherlv_6=(Token)match(input,15,FOLLOW_8); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_6, grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_6());
-                  
+              			newLeafNode(otherlv_6, grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_6());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:137:1: ( (lv_inputs_7_0= ruleInput ) )*
+            // InternalGridSource.g:138:3: ( (lv_inputs_7_0= ruleInput ) )*
             loop1:
             do {
                 int alt1=2;
@@ -331,33 +320,33 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:138:1: (lv_inputs_7_0= ruleInput )
+            	    // InternalGridSource.g:139:4: (lv_inputs_7_0= ruleInput )
             	    {
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:138:1: (lv_inputs_7_0= ruleInput )
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:139:3: lv_inputs_7_0= ruleInput
+            	    // InternalGridSource.g:139:4: (lv_inputs_7_0= ruleInput )
+            	    // InternalGridSource.g:140:5: lv_inputs_7_0= ruleInput
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getSourceAccess().getInputsInputParserRuleCall_7_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getSourceAccess().getInputsInputParserRuleCall_7_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleInput_in_ruleSource233);
+            	    pushFollow(FOLLOW_8);
             	    lv_inputs_7_0=ruleInput();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getSourceRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"inputs",
-            	              		lv_inputs_7_0, 
-            	              		"Input");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getSourceRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"inputs",
+            	      						lv_inputs_7_0,
+            	      						"org.eclipse.osbp.xtext.gridsource.GridSource.Input");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -371,13 +360,13 @@
                 }
             } while (true);
 
-            otherlv_8=(Token)match(input,17,FOLLOW_17_in_ruleSource246); if (state.failed) return current;
+            otherlv_8=(Token)match(input,17,FOLLOW_9); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_8, grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_8());
-                  
+              			newLeafNode(otherlv_8, grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_8());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:159:1: ( (lv_properties_9_0= ruleProperty ) )*
+            // InternalGridSource.g:161:3: ( (lv_properties_9_0= ruleProperty ) )*
             loop2:
             do {
                 int alt2=2;
@@ -390,33 +379,33 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:160:1: (lv_properties_9_0= ruleProperty )
+            	    // InternalGridSource.g:162:4: (lv_properties_9_0= ruleProperty )
             	    {
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:160:1: (lv_properties_9_0= ruleProperty )
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:161:3: lv_properties_9_0= ruleProperty
+            	    // InternalGridSource.g:162:4: (lv_properties_9_0= ruleProperty )
+            	    // InternalGridSource.g:163:5: lv_properties_9_0= ruleProperty
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getSourceAccess().getPropertiesPropertyParserRuleCall_9_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getSourceAccess().getPropertiesPropertyParserRuleCall_9_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleProperty_in_ruleSource267);
+            	    pushFollow(FOLLOW_9);
             	    lv_properties_9_0=ruleProperty();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getSourceRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"properties",
-            	              		lv_properties_9_0, 
-            	              		"Property");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getSourceRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"properties",
+            	      						lv_properties_9_0,
+            	      						"org.eclipse.osbp.xtext.gridsource.GridSource.Property");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -430,11 +419,11 @@
                 }
             } while (true);
 
-            otherlv_10=(Token)match(input,17,FOLLOW_17_in_ruleSource280); if (state.failed) return current;
+            otherlv_10=(Token)match(input,17,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_10, grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_10());
-                  
+              			newLeafNode(otherlv_10, grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_10());
+              		
             }
 
             }
@@ -443,14 +432,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -459,7 +450,7 @@
 
 
     // $ANTLR start "entryRuleInput"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:189:1: entryRuleInput returns [EObject current=null] : iv_ruleInput= ruleInput EOF ;
+    // InternalGridSource.g:188:1: entryRuleInput returns [EObject current=null] : iv_ruleInput= ruleInput EOF ;
     public final EObject entryRuleInput() throws RecognitionException {
         EObject current = null;
 
@@ -467,13 +458,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:190:2: (iv_ruleInput= ruleInput EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:191:2: iv_ruleInput= ruleInput EOF
+            // InternalGridSource.g:188:46: (iv_ruleInput= ruleInput EOF )
+            // InternalGridSource.g:189:2: iv_ruleInput= ruleInput EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getInputRule()); 
             }
-            pushFollow(FOLLOW_ruleInput_in_entryRuleInput316);
+            pushFollow(FOLLOW_1);
             iv_ruleInput=ruleInput();
 
             state._fsp--;
@@ -481,16 +472,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleInput; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleInput326); 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;
@@ -499,7 +490,7 @@
 
 
     // $ANTLR start "ruleInput"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:198:1: ruleInput returns [EObject current=null] : (otherlv_0= 'inputType' ( (lv_inputType_1_0= ruleJvmTypeReference ) ) otherlv_2= 'filters' ( (lv_filters_3_0= ruleEQFilter ) ) (otherlv_4= '&&' ( (lv_filters_5_0= ruleEQFilter ) ) )* ) ;
+    // InternalGridSource.g:195:1: ruleInput returns [EObject current=null] : (otherlv_0= 'inputType' ( (lv_inputType_1_0= ruleJvmTypeReference ) ) otherlv_2= 'filters' ( (lv_filters_3_0= ruleEQFilter ) ) (otherlv_4= '&&' ( (lv_filters_5_0= ruleEQFilter ) ) )* ) ;
     public final EObject ruleInput() throws RecognitionException {
         EObject current = null;
 
@@ -513,49 +504,50 @@
         EObject lv_filters_5_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:201:28: ( (otherlv_0= 'inputType' ( (lv_inputType_1_0= ruleJvmTypeReference ) ) otherlv_2= 'filters' ( (lv_filters_3_0= ruleEQFilter ) ) (otherlv_4= '&&' ( (lv_filters_5_0= ruleEQFilter ) ) )* ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:202:1: (otherlv_0= 'inputType' ( (lv_inputType_1_0= ruleJvmTypeReference ) ) otherlv_2= 'filters' ( (lv_filters_3_0= ruleEQFilter ) ) (otherlv_4= '&&' ( (lv_filters_5_0= ruleEQFilter ) ) )* )
+            // InternalGridSource.g:201:2: ( (otherlv_0= 'inputType' ( (lv_inputType_1_0= ruleJvmTypeReference ) ) otherlv_2= 'filters' ( (lv_filters_3_0= ruleEQFilter ) ) (otherlv_4= '&&' ( (lv_filters_5_0= ruleEQFilter ) ) )* ) )
+            // InternalGridSource.g:202:2: (otherlv_0= 'inputType' ( (lv_inputType_1_0= ruleJvmTypeReference ) ) otherlv_2= 'filters' ( (lv_filters_3_0= ruleEQFilter ) ) (otherlv_4= '&&' ( (lv_filters_5_0= ruleEQFilter ) ) )* )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:202:1: (otherlv_0= 'inputType' ( (lv_inputType_1_0= ruleJvmTypeReference ) ) otherlv_2= 'filters' ( (lv_filters_3_0= ruleEQFilter ) ) (otherlv_4= '&&' ( (lv_filters_5_0= ruleEQFilter ) ) )* )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:202:3: otherlv_0= 'inputType' ( (lv_inputType_1_0= ruleJvmTypeReference ) ) otherlv_2= 'filters' ( (lv_filters_3_0= ruleEQFilter ) ) (otherlv_4= '&&' ( (lv_filters_5_0= ruleEQFilter ) ) )*
+            // InternalGridSource.g:202:2: (otherlv_0= 'inputType' ( (lv_inputType_1_0= ruleJvmTypeReference ) ) otherlv_2= 'filters' ( (lv_filters_3_0= ruleEQFilter ) ) (otherlv_4= '&&' ( (lv_filters_5_0= ruleEQFilter ) ) )* )
+            // InternalGridSource.g:203:3: otherlv_0= 'inputType' ( (lv_inputType_1_0= ruleJvmTypeReference ) ) otherlv_2= 'filters' ( (lv_filters_3_0= ruleEQFilter ) ) (otherlv_4= '&&' ( (lv_filters_5_0= ruleEQFilter ) ) )*
             {
-            otherlv_0=(Token)match(input,18,FOLLOW_18_in_ruleInput363); if (state.failed) return current;
+            otherlv_0=(Token)match(input,18,FOLLOW_5); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getInputAccess().getInputTypeKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getInputAccess().getInputTypeKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:206:1: ( (lv_inputType_1_0= ruleJvmTypeReference ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:207:1: (lv_inputType_1_0= ruleJvmTypeReference )
+            // InternalGridSource.g:207:3: ( (lv_inputType_1_0= ruleJvmTypeReference ) )
+            // InternalGridSource.g:208:4: (lv_inputType_1_0= ruleJvmTypeReference )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:207:1: (lv_inputType_1_0= ruleJvmTypeReference )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:208:3: lv_inputType_1_0= ruleJvmTypeReference
+            // InternalGridSource.g:208:4: (lv_inputType_1_0= ruleJvmTypeReference )
+            // InternalGridSource.g:209:5: lv_inputType_1_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getInputAccess().getInputTypeJvmTypeReferenceParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getInputAccess().getInputTypeJvmTypeReferenceParserRuleCall_1_0());
+              				
             }
-            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleInput384);
+            pushFollow(FOLLOW_10);
             lv_inputType_1_0=ruleJvmTypeReference();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getInputRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"inputType",
-                      		lv_inputType_1_0, 
-                      		"JvmTypeReference");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getInputRule());
+              					}
+              					set(
+              						current,
+              						"inputType",
+              						lv_inputType_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -563,40 +555,40 @@
 
             }
 
-            otherlv_2=(Token)match(input,19,FOLLOW_19_in_ruleInput396); if (state.failed) return current;
+            otherlv_2=(Token)match(input,19,FOLLOW_11); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getInputAccess().getFiltersKeyword_2());
-                  
+              			newLeafNode(otherlv_2, grammarAccess.getInputAccess().getFiltersKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:228:1: ( (lv_filters_3_0= ruleEQFilter ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:229:1: (lv_filters_3_0= ruleEQFilter )
+            // InternalGridSource.g:230:3: ( (lv_filters_3_0= ruleEQFilter ) )
+            // InternalGridSource.g:231:4: (lv_filters_3_0= ruleEQFilter )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:229:1: (lv_filters_3_0= ruleEQFilter )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:230:3: lv_filters_3_0= ruleEQFilter
+            // InternalGridSource.g:231:4: (lv_filters_3_0= ruleEQFilter )
+            // InternalGridSource.g:232:5: lv_filters_3_0= ruleEQFilter
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_3_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_3_0());
+              				
             }
-            pushFollow(FOLLOW_ruleEQFilter_in_ruleInput417);
+            pushFollow(FOLLOW_12);
             lv_filters_3_0=ruleEQFilter();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getInputRule());
-              	        }
-                     		add(
-                     			current, 
-                     			"filters",
-                      		lv_filters_3_0, 
-                      		"EQFilter");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getInputRule());
+              					}
+              					add(
+              						current,
+              						"filters",
+              						lv_filters_3_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.EQFilter");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -604,7 +596,7 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:246:2: (otherlv_4= '&&' ( (lv_filters_5_0= ruleEQFilter ) ) )*
+            // InternalGridSource.g:249:3: (otherlv_4= '&&' ( (lv_filters_5_0= ruleEQFilter ) ) )*
             loop3:
             do {
                 int alt3=2;
@@ -617,42 +609,42 @@
 
                 switch (alt3) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:246:4: otherlv_4= '&&' ( (lv_filters_5_0= ruleEQFilter ) )
+            	    // InternalGridSource.g:250:4: otherlv_4= '&&' ( (lv_filters_5_0= ruleEQFilter ) )
             	    {
-            	    otherlv_4=(Token)match(input,20,FOLLOW_20_in_ruleInput430); if (state.failed) return current;
+            	    otherlv_4=(Token)match(input,20,FOLLOW_11); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	          	newLeafNode(otherlv_4, grammarAccess.getInputAccess().getAmpersandAmpersandKeyword_4_0());
-            	          
+            	      				newLeafNode(otherlv_4, grammarAccess.getInputAccess().getAmpersandAmpersandKeyword_4_0());
+            	      			
             	    }
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:250:1: ( (lv_filters_5_0= ruleEQFilter ) )
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:251:1: (lv_filters_5_0= ruleEQFilter )
+            	    // InternalGridSource.g:254:4: ( (lv_filters_5_0= ruleEQFilter ) )
+            	    // InternalGridSource.g:255:5: (lv_filters_5_0= ruleEQFilter )
             	    {
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:251:1: (lv_filters_5_0= ruleEQFilter )
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:252:3: lv_filters_5_0= ruleEQFilter
+            	    // InternalGridSource.g:255:5: (lv_filters_5_0= ruleEQFilter )
+            	    // InternalGridSource.g:256:6: lv_filters_5_0= ruleEQFilter
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_4_1_0()); 
-            	      	    
+
+            	      						newCompositeNode(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_4_1_0());
+            	      					
             	    }
-            	    pushFollow(FOLLOW_ruleEQFilter_in_ruleInput451);
+            	    pushFollow(FOLLOW_12);
             	    lv_filters_5_0=ruleEQFilter();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getInputRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"filters",
-            	              		lv_filters_5_0, 
-            	              		"EQFilter");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      						if (current==null) {
+            	      							current = createModelElementForParent(grammarAccess.getInputRule());
+            	      						}
+            	      						add(
+            	      							current,
+            	      							"filters",
+            	      							lv_filters_5_0,
+            	      							"org.eclipse.osbp.xtext.gridsource.GridSource.EQFilter");
+            	      						afterParserOrEnumRuleCall();
+            	      					
             	    }
 
             	    }
@@ -676,14 +668,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -692,7 +686,7 @@
 
 
     // $ANTLR start "entryRuleEQFilter"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:276:1: entryRuleEQFilter returns [EObject current=null] : iv_ruleEQFilter= ruleEQFilter EOF ;
+    // InternalGridSource.g:278:1: entryRuleEQFilter returns [EObject current=null] : iv_ruleEQFilter= ruleEQFilter EOF ;
     public final EObject entryRuleEQFilter() throws RecognitionException {
         EObject current = null;
 
@@ -700,13 +694,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:277:2: (iv_ruleEQFilter= ruleEQFilter EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:278:2: iv_ruleEQFilter= ruleEQFilter EOF
+            // InternalGridSource.g:278:49: (iv_ruleEQFilter= ruleEQFilter EOF )
+            // InternalGridSource.g:279:2: iv_ruleEQFilter= ruleEQFilter EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getEQFilterRule()); 
             }
-            pushFollow(FOLLOW_ruleEQFilter_in_entryRuleEQFilter489);
+            pushFollow(FOLLOW_1);
             iv_ruleEQFilter=ruleEQFilter();
 
             state._fsp--;
@@ -714,16 +708,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleEQFilter; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleEQFilter499); 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;
@@ -732,7 +726,7 @@
 
 
     // $ANTLR start "ruleEQFilter"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:285:1: ruleEQFilter returns [EObject current=null] : ( () otherlv_1= 'root:' ( (lv_rootTypePropertyPath_2_0= ruleNestedField ) ) otherlv_3= '=' otherlv_4= 'input:' ( (lv_inputTypePropertyPath_5_0= ruleNestedField ) ) ) ;
+    // InternalGridSource.g:285:1: ruleEQFilter returns [EObject current=null] : ( () otherlv_1= 'root:' ( (lv_rootTypePropertyPath_2_0= ruleNestedField ) ) otherlv_3= '=' otherlv_4= 'input:' ( (lv_inputTypePropertyPath_5_0= ruleNestedField ) ) ) ;
     public final EObject ruleEQFilter() throws RecognitionException {
         EObject current = null;
 
@@ -744,62 +738,63 @@
         EObject lv_inputTypePropertyPath_5_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:288:28: ( ( () otherlv_1= 'root:' ( (lv_rootTypePropertyPath_2_0= ruleNestedField ) ) otherlv_3= '=' otherlv_4= 'input:' ( (lv_inputTypePropertyPath_5_0= ruleNestedField ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:289:1: ( () otherlv_1= 'root:' ( (lv_rootTypePropertyPath_2_0= ruleNestedField ) ) otherlv_3= '=' otherlv_4= 'input:' ( (lv_inputTypePropertyPath_5_0= ruleNestedField ) ) )
+            // InternalGridSource.g:291:2: ( ( () otherlv_1= 'root:' ( (lv_rootTypePropertyPath_2_0= ruleNestedField ) ) otherlv_3= '=' otherlv_4= 'input:' ( (lv_inputTypePropertyPath_5_0= ruleNestedField ) ) ) )
+            // InternalGridSource.g:292:2: ( () otherlv_1= 'root:' ( (lv_rootTypePropertyPath_2_0= ruleNestedField ) ) otherlv_3= '=' otherlv_4= 'input:' ( (lv_inputTypePropertyPath_5_0= ruleNestedField ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:289:1: ( () otherlv_1= 'root:' ( (lv_rootTypePropertyPath_2_0= ruleNestedField ) ) otherlv_3= '=' otherlv_4= 'input:' ( (lv_inputTypePropertyPath_5_0= ruleNestedField ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:289:2: () otherlv_1= 'root:' ( (lv_rootTypePropertyPath_2_0= ruleNestedField ) ) otherlv_3= '=' otherlv_4= 'input:' ( (lv_inputTypePropertyPath_5_0= ruleNestedField ) )
+            // InternalGridSource.g:292:2: ( () otherlv_1= 'root:' ( (lv_rootTypePropertyPath_2_0= ruleNestedField ) ) otherlv_3= '=' otherlv_4= 'input:' ( (lv_inputTypePropertyPath_5_0= ruleNestedField ) ) )
+            // InternalGridSource.g:293:3: () otherlv_1= 'root:' ( (lv_rootTypePropertyPath_2_0= ruleNestedField ) ) otherlv_3= '=' otherlv_4= 'input:' ( (lv_inputTypePropertyPath_5_0= ruleNestedField ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:289:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:290:5: 
+            // InternalGridSource.g:293:3: ()
+            // InternalGridSource.g:294:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getEQFilterAccess().getCxGridSourceEQFilterAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getEQFilterAccess().getCxGridSourceEQFilterAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,21,FOLLOW_21_in_ruleEQFilter545); if (state.failed) return current;
+            otherlv_1=(Token)match(input,21,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getEQFilterAccess().getRootKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getEQFilterAccess().getRootKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:299:1: ( (lv_rootTypePropertyPath_2_0= ruleNestedField ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:300:1: (lv_rootTypePropertyPath_2_0= ruleNestedField )
+            // InternalGridSource.g:304:3: ( (lv_rootTypePropertyPath_2_0= ruleNestedField ) )
+            // InternalGridSource.g:305:4: (lv_rootTypePropertyPath_2_0= ruleNestedField )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:300:1: (lv_rootTypePropertyPath_2_0= ruleNestedField )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:301:3: lv_rootTypePropertyPath_2_0= ruleNestedField
+            // InternalGridSource.g:305:4: (lv_rootTypePropertyPath_2_0= ruleNestedField )
+            // InternalGridSource.g:306:5: lv_rootTypePropertyPath_2_0= ruleNestedField
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEQFilterAccess().getRootTypePropertyPathNestedFieldParserRuleCall_2_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getEQFilterAccess().getRootTypePropertyPathNestedFieldParserRuleCall_2_0());
+              				
             }
-            pushFollow(FOLLOW_ruleNestedField_in_ruleEQFilter566);
+            pushFollow(FOLLOW_13);
             lv_rootTypePropertyPath_2_0=ruleNestedField();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEQFilterRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"rootTypePropertyPath",
-                      		lv_rootTypePropertyPath_2_0, 
-                      		"NestedField");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEQFilterRule());
+              					}
+              					set(
+              						current,
+              						"rootTypePropertyPath",
+              						lv_rootTypePropertyPath_2_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -807,46 +802,46 @@
 
             }
 
-            otherlv_3=(Token)match(input,22,FOLLOW_22_in_ruleEQFilter578); if (state.failed) return current;
+            otherlv_3=(Token)match(input,22,FOLLOW_14); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_3, grammarAccess.getEQFilterAccess().getEqualsSignKeyword_3());
-                  
+              			newLeafNode(otherlv_3, grammarAccess.getEQFilterAccess().getEqualsSignKeyword_3());
+              		
             }
-            otherlv_4=(Token)match(input,23,FOLLOW_23_in_ruleEQFilter590); if (state.failed) return current;
+            otherlv_4=(Token)match(input,23,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_4, grammarAccess.getEQFilterAccess().getInputKeyword_4());
-                  
+              			newLeafNode(otherlv_4, grammarAccess.getEQFilterAccess().getInputKeyword_4());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:325:1: ( (lv_inputTypePropertyPath_5_0= ruleNestedField ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:326:1: (lv_inputTypePropertyPath_5_0= ruleNestedField )
+            // InternalGridSource.g:331:3: ( (lv_inputTypePropertyPath_5_0= ruleNestedField ) )
+            // InternalGridSource.g:332:4: (lv_inputTypePropertyPath_5_0= ruleNestedField )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:326:1: (lv_inputTypePropertyPath_5_0= ruleNestedField )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:327:3: lv_inputTypePropertyPath_5_0= ruleNestedField
+            // InternalGridSource.g:332:4: (lv_inputTypePropertyPath_5_0= ruleNestedField )
+            // InternalGridSource.g:333:5: lv_inputTypePropertyPath_5_0= ruleNestedField
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getEQFilterAccess().getInputTypePropertyPathNestedFieldParserRuleCall_5_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getEQFilterAccess().getInputTypePropertyPathNestedFieldParserRuleCall_5_0());
+              				
             }
-            pushFollow(FOLLOW_ruleNestedField_in_ruleEQFilter611);
+            pushFollow(FOLLOW_2);
             lv_inputTypePropertyPath_5_0=ruleNestedField();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getEQFilterRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"inputTypePropertyPath",
-                      		lv_inputTypePropertyPath_5_0, 
-                      		"NestedField");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getEQFilterRule());
+              					}
+              					set(
+              						current,
+              						"inputTypePropertyPath",
+              						lv_inputTypePropertyPath_5_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -861,14 +856,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -877,7 +874,7 @@
 
 
     // $ANTLR start "entryRuleProperty"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:351:1: entryRuleProperty returns [EObject current=null] : iv_ruleProperty= ruleProperty EOF ;
+    // InternalGridSource.g:354:1: entryRuleProperty returns [EObject current=null] : iv_ruleProperty= ruleProperty EOF ;
     public final EObject entryRuleProperty() throws RecognitionException {
         EObject current = null;
 
@@ -885,13 +882,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:352:2: (iv_ruleProperty= ruleProperty EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:353:2: iv_ruleProperty= ruleProperty EOF
+            // InternalGridSource.g:354:49: (iv_ruleProperty= ruleProperty EOF )
+            // InternalGridSource.g:355:2: iv_ruleProperty= ruleProperty EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyRule()); 
             }
-            pushFollow(FOLLOW_ruleProperty_in_entryRuleProperty647);
+            pushFollow(FOLLOW_1);
             iv_ruleProperty=ruleProperty();
 
             state._fsp--;
@@ -899,16 +896,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleProperty; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleProperty657); 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;
@@ -917,7 +914,7 @@
 
 
     // $ANTLR start "ruleProperty"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:360:1: ruleProperty returns [EObject current=null] : (otherlv_0= 'prop' ( (lv_path_1_0= ruleNestedField ) ) otherlv_2= 'style' ( (lv_style_3_0= rulePropertyStyle ) ) ) ;
+    // InternalGridSource.g:361:1: ruleProperty returns [EObject current=null] : (otherlv_0= 'prop' ( (lv_path_1_0= ruleNestedField ) ) otherlv_2= 'style' ( (lv_style_3_0= rulePropertyStyle ) ) ) ;
     public final EObject ruleProperty() throws RecognitionException {
         EObject current = null;
 
@@ -928,49 +925,50 @@
         EObject lv_style_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:363:28: ( (otherlv_0= 'prop' ( (lv_path_1_0= ruleNestedField ) ) otherlv_2= 'style' ( (lv_style_3_0= rulePropertyStyle ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:364:1: (otherlv_0= 'prop' ( (lv_path_1_0= ruleNestedField ) ) otherlv_2= 'style' ( (lv_style_3_0= rulePropertyStyle ) ) )
+            // InternalGridSource.g:367:2: ( (otherlv_0= 'prop' ( (lv_path_1_0= ruleNestedField ) ) otherlv_2= 'style' ( (lv_style_3_0= rulePropertyStyle ) ) ) )
+            // InternalGridSource.g:368:2: (otherlv_0= 'prop' ( (lv_path_1_0= ruleNestedField ) ) otherlv_2= 'style' ( (lv_style_3_0= rulePropertyStyle ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:364:1: (otherlv_0= 'prop' ( (lv_path_1_0= ruleNestedField ) ) otherlv_2= 'style' ( (lv_style_3_0= rulePropertyStyle ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:364:3: otherlv_0= 'prop' ( (lv_path_1_0= ruleNestedField ) ) otherlv_2= 'style' ( (lv_style_3_0= rulePropertyStyle ) )
+            // InternalGridSource.g:368:2: (otherlv_0= 'prop' ( (lv_path_1_0= ruleNestedField ) ) otherlv_2= 'style' ( (lv_style_3_0= rulePropertyStyle ) ) )
+            // InternalGridSource.g:369:3: otherlv_0= 'prop' ( (lv_path_1_0= ruleNestedField ) ) otherlv_2= 'style' ( (lv_style_3_0= rulePropertyStyle ) )
             {
-            otherlv_0=(Token)match(input,24,FOLLOW_24_in_ruleProperty694); if (state.failed) return current;
+            otherlv_0=(Token)match(input,24,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getPropertyAccess().getPropKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getPropertyAccess().getPropKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:368:1: ( (lv_path_1_0= ruleNestedField ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:369:1: (lv_path_1_0= ruleNestedField )
+            // InternalGridSource.g:373:3: ( (lv_path_1_0= ruleNestedField ) )
+            // InternalGridSource.g:374:4: (lv_path_1_0= ruleNestedField )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:369:1: (lv_path_1_0= ruleNestedField )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:370:3: lv_path_1_0= ruleNestedField
+            // InternalGridSource.g:374:4: (lv_path_1_0= ruleNestedField )
+            // InternalGridSource.g:375:5: lv_path_1_0= ruleNestedField
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getPropertyAccess().getPathNestedFieldParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getPropertyAccess().getPathNestedFieldParserRuleCall_1_0());
+              				
             }
-            pushFollow(FOLLOW_ruleNestedField_in_ruleProperty715);
+            pushFollow(FOLLOW_15);
             lv_path_1_0=ruleNestedField();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getPropertyRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"path",
-                      		lv_path_1_0, 
-                      		"NestedField");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPropertyRule());
+              					}
+              					set(
+              						current,
+              						"path",
+              						lv_path_1_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -978,40 +976,40 @@
 
             }
 
-            otherlv_2=(Token)match(input,25,FOLLOW_25_in_ruleProperty727); if (state.failed) return current;
+            otherlv_2=(Token)match(input,25,FOLLOW_16); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getPropertyAccess().getStyleKeyword_2());
-                  
+              			newLeafNode(otherlv_2, grammarAccess.getPropertyAccess().getStyleKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:390:1: ( (lv_style_3_0= rulePropertyStyle ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:391:1: (lv_style_3_0= rulePropertyStyle )
+            // InternalGridSource.g:396:3: ( (lv_style_3_0= rulePropertyStyle ) )
+            // InternalGridSource.g:397:4: (lv_style_3_0= rulePropertyStyle )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:391:1: (lv_style_3_0= rulePropertyStyle )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:392:3: lv_style_3_0= rulePropertyStyle
+            // InternalGridSource.g:397:4: (lv_style_3_0= rulePropertyStyle )
+            // InternalGridSource.g:398:5: lv_style_3_0= rulePropertyStyle
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getPropertyAccess().getStylePropertyStyleParserRuleCall_3_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getPropertyAccess().getStylePropertyStyleParserRuleCall_3_0());
+              				
             }
-            pushFollow(FOLLOW_rulePropertyStyle_in_ruleProperty748);
+            pushFollow(FOLLOW_2);
             lv_style_3_0=rulePropertyStyle();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getPropertyRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"style",
-                      		lv_style_3_0, 
-                      		"PropertyStyle");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPropertyRule());
+              					}
+              					set(
+              						current,
+              						"style",
+              						lv_style_3_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.PropertyStyle");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -1026,14 +1024,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1042,7 +1042,7 @@
 
 
     // $ANTLR start "entryRuleNestedField"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:416:1: entryRuleNestedField returns [EObject current=null] : iv_ruleNestedField= ruleNestedField EOF ;
+    // InternalGridSource.g:419:1: entryRuleNestedField returns [EObject current=null] : iv_ruleNestedField= ruleNestedField EOF ;
     public final EObject entryRuleNestedField() throws RecognitionException {
         EObject current = null;
 
@@ -1050,13 +1050,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:417:2: (iv_ruleNestedField= ruleNestedField EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:418:2: iv_ruleNestedField= ruleNestedField EOF
+            // InternalGridSource.g:419:52: (iv_ruleNestedField= ruleNestedField EOF )
+            // InternalGridSource.g:420:2: iv_ruleNestedField= ruleNestedField EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getNestedFieldRule()); 
             }
-            pushFollow(FOLLOW_ruleNestedField_in_entryRuleNestedField784);
+            pushFollow(FOLLOW_1);
             iv_ruleNestedField=ruleNestedField();
 
             state._fsp--;
@@ -1064,16 +1064,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleNestedField; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleNestedField794); 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;
@@ -1082,7 +1082,7 @@
 
 
     // $ANTLR start "ruleNestedField"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:425:1: ruleNestedField returns [EObject current=null] : ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleNestedPath ) )? ) ;
+    // InternalGridSource.g:426:1: ruleNestedField returns [EObject current=null] : ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleNestedPath ) )? ) ;
     public final EObject ruleNestedField() throws RecognitionException {
         EObject current = null;
 
@@ -1090,46 +1090,47 @@
         EObject lv_path_2_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:428:28: ( ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleNestedPath ) )? ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:429:1: ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleNestedPath ) )? )
+            // InternalGridSource.g:432:2: ( ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleNestedPath ) )? ) )
+            // InternalGridSource.g:433:2: ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleNestedPath ) )? )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:429:1: ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleNestedPath ) )? )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:429:2: () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleNestedPath ) )?
+            // InternalGridSource.g:433:2: ( () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleNestedPath ) )? )
+            // InternalGridSource.g:434:3: () ( (otherlv_1= RULE_ID ) ) ( (lv_path_2_0= ruleNestedPath ) )?
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:429:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:430:5: 
+            // InternalGridSource.g:434:3: ()
+            // InternalGridSource.g:435:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getNestedFieldAccess().getCxGridNestedFieldAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getNestedFieldAccess().getCxGridNestedFieldAction_0(),
+              					current);
+              			
             }
 
             }
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:435:2: ( (otherlv_1= RULE_ID ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:436:1: (otherlv_1= RULE_ID )
+            // InternalGridSource.g:441:3: ( (otherlv_1= RULE_ID ) )
+            // InternalGridSource.g:442:4: (otherlv_1= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:436:1: (otherlv_1= RULE_ID )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:437:3: otherlv_1= RULE_ID
+            // InternalGridSource.g:442:4: (otherlv_1= RULE_ID )
+            // InternalGridSource.g:443:5: otherlv_1= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getNestedFieldRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getNestedFieldRule());
+              					}
+              				
             }
-            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleNestedField848); if (state.failed) return current;
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_17); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_1, grammarAccess.getNestedFieldAccess().getFieldJvmOperationCrossReference_1_0()); 
-              	
+              					newLeafNode(otherlv_1, grammarAccess.getNestedFieldAccess().getFieldJvmOperationCrossReference_1_0());
+              				
             }
 
             }
@@ -1137,7 +1138,7 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:448:2: ( (lv_path_2_0= ruleNestedPath ) )?
+            // InternalGridSource.g:454:3: ( (lv_path_2_0= ruleNestedPath ) )?
             int alt4=2;
             int LA4_0 = input.LA(1);
 
@@ -1146,33 +1147,33 @@
             }
             switch (alt4) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:449:1: (lv_path_2_0= ruleNestedPath )
+                    // InternalGridSource.g:455:4: (lv_path_2_0= ruleNestedPath )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:449:1: (lv_path_2_0= ruleNestedPath )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:450:3: lv_path_2_0= ruleNestedPath
+                    // InternalGridSource.g:455:4: (lv_path_2_0= ruleNestedPath )
+                    // InternalGridSource.g:456:5: lv_path_2_0= ruleNestedPath
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getNestedFieldAccess().getPathNestedPathParserRuleCall_2_0()); 
-                      	    
+
+                      					newCompositeNode(grammarAccess.getNestedFieldAccess().getPathNestedPathParserRuleCall_2_0());
+                      				
                     }
-                    pushFollow(FOLLOW_ruleNestedPath_in_ruleNestedField869);
+                    pushFollow(FOLLOW_2);
                     lv_path_2_0=ruleNestedPath();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getNestedFieldRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"path",
-                              		lv_path_2_0, 
-                              		"NestedPath");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getNestedFieldRule());
+                      					}
+                      					set(
+                      						current,
+                      						"path",
+                      						lv_path_2_0,
+                      						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedPath");
+                      					afterParserOrEnumRuleCall();
+                      				
                     }
 
                     }
@@ -1190,14 +1191,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1206,7 +1209,7 @@
 
 
     // $ANTLR start "entryRuleNestedPath"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:474:1: entryRuleNestedPath returns [EObject current=null] : iv_ruleNestedPath= ruleNestedPath EOF ;
+    // InternalGridSource.g:477:1: entryRuleNestedPath returns [EObject current=null] : iv_ruleNestedPath= ruleNestedPath EOF ;
     public final EObject entryRuleNestedPath() throws RecognitionException {
         EObject current = null;
 
@@ -1214,13 +1217,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:475:2: (iv_ruleNestedPath= ruleNestedPath EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:476:2: iv_ruleNestedPath= ruleNestedPath EOF
+            // InternalGridSource.g:477:51: (iv_ruleNestedPath= ruleNestedPath EOF )
+            // InternalGridSource.g:478:2: iv_ruleNestedPath= ruleNestedPath EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getNestedPathRule()); 
             }
-            pushFollow(FOLLOW_ruleNestedPath_in_entryRuleNestedPath906);
+            pushFollow(FOLLOW_1);
             iv_ruleNestedPath=ruleNestedPath();
 
             state._fsp--;
@@ -1228,16 +1231,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleNestedPath; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleNestedPath916); 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;
@@ -1246,7 +1249,7 @@
 
 
     // $ANTLR start "ruleNestedPath"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:483:1: ruleNestedPath returns [EObject current=null] : ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleNestedPath ) )? ) ;
+    // InternalGridSource.g:484:1: ruleNestedPath returns [EObject current=null] : ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleNestedPath ) )? ) ;
     public final EObject ruleNestedPath() throws RecognitionException {
         EObject current = null;
 
@@ -1255,52 +1258,53 @@
         EObject lv_path_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:486:28: ( ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleNestedPath ) )? ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:487:1: ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleNestedPath ) )? )
+            // InternalGridSource.g:490:2: ( ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleNestedPath ) )? ) )
+            // InternalGridSource.g:491:2: ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleNestedPath ) )? )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:487:1: ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleNestedPath ) )? )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:487:2: () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleNestedPath ) )?
+            // InternalGridSource.g:491:2: ( () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleNestedPath ) )? )
+            // InternalGridSource.g:492:3: () otherlv_1= '.' ( (otherlv_2= RULE_ID ) ) ( (lv_path_3_0= ruleNestedPath ) )?
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:487:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:488:5: 
+            // InternalGridSource.g:492:3: ()
+            // InternalGridSource.g:493:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getNestedPathAccess().getCxGridNestedPathAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getNestedPathAccess().getCxGridNestedPathAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,26,FOLLOW_26_in_ruleNestedPath962); if (state.failed) return current;
+            otherlv_1=(Token)match(input,26,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getNestedPathAccess().getFullStopKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getNestedPathAccess().getFullStopKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:497:1: ( (otherlv_2= RULE_ID ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:498:1: (otherlv_2= RULE_ID )
+            // InternalGridSource.g:503:3: ( (otherlv_2= RULE_ID ) )
+            // InternalGridSource.g:504:4: (otherlv_2= RULE_ID )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:498:1: (otherlv_2= RULE_ID )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:499:3: otherlv_2= RULE_ID
+            // InternalGridSource.g:504:4: (otherlv_2= RULE_ID )
+            // InternalGridSource.g:505:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getNestedPathRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getNestedPathRule());
+              					}
+              				
             }
-            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleNestedPath982); if (state.failed) return current;
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_17); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		newLeafNode(otherlv_2, grammarAccess.getNestedPathAccess().getFieldJvmOperationCrossReference_2_0()); 
-              	
+              					newLeafNode(otherlv_2, grammarAccess.getNestedPathAccess().getFieldJvmOperationCrossReference_2_0());
+              				
             }
 
             }
@@ -1308,7 +1312,7 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:510:2: ( (lv_path_3_0= ruleNestedPath ) )?
+            // InternalGridSource.g:516:3: ( (lv_path_3_0= ruleNestedPath ) )?
             int alt5=2;
             int LA5_0 = input.LA(1);
 
@@ -1317,33 +1321,33 @@
             }
             switch (alt5) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:511:1: (lv_path_3_0= ruleNestedPath )
+                    // InternalGridSource.g:517:4: (lv_path_3_0= ruleNestedPath )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:511:1: (lv_path_3_0= ruleNestedPath )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:512:3: lv_path_3_0= ruleNestedPath
+                    // InternalGridSource.g:517:4: (lv_path_3_0= ruleNestedPath )
+                    // InternalGridSource.g:518:5: lv_path_3_0= ruleNestedPath
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getNestedPathAccess().getPathNestedPathParserRuleCall_3_0()); 
-                      	    
+
+                      					newCompositeNode(grammarAccess.getNestedPathAccess().getPathNestedPathParserRuleCall_3_0());
+                      				
                     }
-                    pushFollow(FOLLOW_ruleNestedPath_in_ruleNestedPath1003);
+                    pushFollow(FOLLOW_2);
                     lv_path_3_0=ruleNestedPath();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElementForParent(grammarAccess.getNestedPathRule());
-                      	        }
-                             		set(
-                             			current, 
-                             			"path",
-                              		lv_path_3_0, 
-                              		"NestedPath");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getNestedPathRule());
+                      					}
+                      					set(
+                      						current,
+                      						"path",
+                      						lv_path_3_0,
+                      						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedPath");
+                      					afterParserOrEnumRuleCall();
+                      				
                     }
 
                     }
@@ -1361,14 +1365,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1377,7 +1383,7 @@
 
 
     // $ANTLR start "entryRulePropertyStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:536:1: entryRulePropertyStyle returns [EObject current=null] : iv_rulePropertyStyle= rulePropertyStyle EOF ;
+    // InternalGridSource.g:539:1: entryRulePropertyStyle returns [EObject current=null] : iv_rulePropertyStyle= rulePropertyStyle EOF ;
     public final EObject entryRulePropertyStyle() throws RecognitionException {
         EObject current = null;
 
@@ -1385,13 +1391,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:537:2: (iv_rulePropertyStyle= rulePropertyStyle EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:538:2: iv_rulePropertyStyle= rulePropertyStyle EOF
+            // InternalGridSource.g:539:54: (iv_rulePropertyStyle= rulePropertyStyle EOF )
+            // InternalGridSource.g:540:2: iv_rulePropertyStyle= rulePropertyStyle EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyStyleRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyStyle_in_entryRulePropertyStyle1040);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyStyle=rulePropertyStyle();
 
             state._fsp--;
@@ -1399,16 +1405,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyStyle; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyStyle1050); 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;
@@ -1417,7 +1423,7 @@
 
 
     // $ANTLR start "rulePropertyStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:545:1: rulePropertyStyle returns [EObject current=null] : (this_PropertyButtonStyle_0= rulePropertyButtonStyle | this_PropertyHtmlStyle_1= rulePropertyHtmlStyle | this_PropertyProgressbarStyle_2= rulePropertyProgressbarStyle | this_PropertyTextStyle_3= rulePropertyTextStyle | this_PropertyBooleanStyle_4= rulePropertyBooleanStyle | this_PropertyDateStyle_5= rulePropertyDateStyle | this_PropertyNumberStyle_6= rulePropertyNumberStyle | this_PropertyImageStyle_7= rulePropertyImageStyle | this_PropertyQuantityStyle_8= rulePropertyQuantityStyle | this_PropertyPriceStyle_9= rulePropertyPriceStyle | this_GridPropIndicatorStyle_10= ruleGridPropIndicatorStyle ) ;
+    // InternalGridSource.g:546:1: rulePropertyStyle returns [EObject current=null] : (this_PropertyButtonStyle_0= rulePropertyButtonStyle | this_PropertyHtmlStyle_1= rulePropertyHtmlStyle | this_PropertyProgressbarStyle_2= rulePropertyProgressbarStyle | this_PropertyTextStyle_3= rulePropertyTextStyle | this_PropertyBooleanStyle_4= rulePropertyBooleanStyle | this_PropertyDateStyle_5= rulePropertyDateStyle | this_PropertyNumberStyle_6= rulePropertyNumberStyle | this_PropertyImageStyle_7= rulePropertyImageStyle | this_PropertyQuantityStyle_8= rulePropertyQuantityStyle | this_PropertyPriceStyle_9= rulePropertyPriceStyle | this_GridPropIndicatorStyle_10= ruleGridPropIndicatorStyle ) ;
     public final EObject rulePropertyStyle() throws RecognitionException {
         EObject current = null;
 
@@ -1444,13 +1450,14 @@
         EObject this_GridPropIndicatorStyle_10 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:548:28: ( (this_PropertyButtonStyle_0= rulePropertyButtonStyle | this_PropertyHtmlStyle_1= rulePropertyHtmlStyle | this_PropertyProgressbarStyle_2= rulePropertyProgressbarStyle | this_PropertyTextStyle_3= rulePropertyTextStyle | this_PropertyBooleanStyle_4= rulePropertyBooleanStyle | this_PropertyDateStyle_5= rulePropertyDateStyle | this_PropertyNumberStyle_6= rulePropertyNumberStyle | this_PropertyImageStyle_7= rulePropertyImageStyle | this_PropertyQuantityStyle_8= rulePropertyQuantityStyle | this_PropertyPriceStyle_9= rulePropertyPriceStyle | this_GridPropIndicatorStyle_10= ruleGridPropIndicatorStyle ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:549:1: (this_PropertyButtonStyle_0= rulePropertyButtonStyle | this_PropertyHtmlStyle_1= rulePropertyHtmlStyle | this_PropertyProgressbarStyle_2= rulePropertyProgressbarStyle | this_PropertyTextStyle_3= rulePropertyTextStyle | this_PropertyBooleanStyle_4= rulePropertyBooleanStyle | this_PropertyDateStyle_5= rulePropertyDateStyle | this_PropertyNumberStyle_6= rulePropertyNumberStyle | this_PropertyImageStyle_7= rulePropertyImageStyle | this_PropertyQuantityStyle_8= rulePropertyQuantityStyle | this_PropertyPriceStyle_9= rulePropertyPriceStyle | this_GridPropIndicatorStyle_10= ruleGridPropIndicatorStyle )
+            // InternalGridSource.g:552:2: ( (this_PropertyButtonStyle_0= rulePropertyButtonStyle | this_PropertyHtmlStyle_1= rulePropertyHtmlStyle | this_PropertyProgressbarStyle_2= rulePropertyProgressbarStyle | this_PropertyTextStyle_3= rulePropertyTextStyle | this_PropertyBooleanStyle_4= rulePropertyBooleanStyle | this_PropertyDateStyle_5= rulePropertyDateStyle | this_PropertyNumberStyle_6= rulePropertyNumberStyle | this_PropertyImageStyle_7= rulePropertyImageStyle | this_PropertyQuantityStyle_8= rulePropertyQuantityStyle | this_PropertyPriceStyle_9= rulePropertyPriceStyle | this_GridPropIndicatorStyle_10= ruleGridPropIndicatorStyle ) )
+            // InternalGridSource.g:553:2: (this_PropertyButtonStyle_0= rulePropertyButtonStyle | this_PropertyHtmlStyle_1= rulePropertyHtmlStyle | this_PropertyProgressbarStyle_2= rulePropertyProgressbarStyle | this_PropertyTextStyle_3= rulePropertyTextStyle | this_PropertyBooleanStyle_4= rulePropertyBooleanStyle | this_PropertyDateStyle_5= rulePropertyDateStyle | this_PropertyNumberStyle_6= rulePropertyNumberStyle | this_PropertyImageStyle_7= rulePropertyImageStyle | this_PropertyQuantityStyle_8= rulePropertyQuantityStyle | this_PropertyPriceStyle_9= rulePropertyPriceStyle | this_GridPropIndicatorStyle_10= ruleGridPropIndicatorStyle )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:549:1: (this_PropertyButtonStyle_0= rulePropertyButtonStyle | this_PropertyHtmlStyle_1= rulePropertyHtmlStyle | this_PropertyProgressbarStyle_2= rulePropertyProgressbarStyle | this_PropertyTextStyle_3= rulePropertyTextStyle | this_PropertyBooleanStyle_4= rulePropertyBooleanStyle | this_PropertyDateStyle_5= rulePropertyDateStyle | this_PropertyNumberStyle_6= rulePropertyNumberStyle | this_PropertyImageStyle_7= rulePropertyImageStyle | this_PropertyQuantityStyle_8= rulePropertyQuantityStyle | this_PropertyPriceStyle_9= rulePropertyPriceStyle | this_GridPropIndicatorStyle_10= ruleGridPropIndicatorStyle )
+            // InternalGridSource.g:553:2: (this_PropertyButtonStyle_0= rulePropertyButtonStyle | this_PropertyHtmlStyle_1= rulePropertyHtmlStyle | this_PropertyProgressbarStyle_2= rulePropertyProgressbarStyle | this_PropertyTextStyle_3= rulePropertyTextStyle | this_PropertyBooleanStyle_4= rulePropertyBooleanStyle | this_PropertyDateStyle_5= rulePropertyDateStyle | this_PropertyNumberStyle_6= rulePropertyNumberStyle | this_PropertyImageStyle_7= rulePropertyImageStyle | this_PropertyQuantityStyle_8= rulePropertyQuantityStyle | this_PropertyPriceStyle_9= rulePropertyPriceStyle | this_GridPropIndicatorStyle_10= ruleGridPropIndicatorStyle )
             int alt6=11;
             switch ( input.LA(1) ) {
             case 27:
@@ -1518,243 +1525,243 @@
 
             switch (alt6) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:550:5: this_PropertyButtonStyle_0= rulePropertyButtonStyle
+                    // InternalGridSource.g:554:3: this_PropertyButtonStyle_0= rulePropertyButtonStyle
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyButtonStyleParserRuleCall_0()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyButtonStyleParserRuleCall_0());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyButtonStyle_in_rulePropertyStyle1097);
+                    pushFollow(FOLLOW_2);
                     this_PropertyButtonStyle_0=rulePropertyButtonStyle();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyButtonStyle_0; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyButtonStyle_0;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:560:5: this_PropertyHtmlStyle_1= rulePropertyHtmlStyle
+                    // InternalGridSource.g:563:3: this_PropertyHtmlStyle_1= rulePropertyHtmlStyle
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyHtmlStyleParserRuleCall_1()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyHtmlStyleParserRuleCall_1());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyHtmlStyle_in_rulePropertyStyle1124);
+                    pushFollow(FOLLOW_2);
                     this_PropertyHtmlStyle_1=rulePropertyHtmlStyle();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyHtmlStyle_1; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyHtmlStyle_1;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:570:5: this_PropertyProgressbarStyle_2= rulePropertyProgressbarStyle
+                    // InternalGridSource.g:572:3: this_PropertyProgressbarStyle_2= rulePropertyProgressbarStyle
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyProgressbarStyleParserRuleCall_2()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyProgressbarStyleParserRuleCall_2());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyProgressbarStyle_in_rulePropertyStyle1151);
+                    pushFollow(FOLLOW_2);
                     this_PropertyProgressbarStyle_2=rulePropertyProgressbarStyle();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyProgressbarStyle_2; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyProgressbarStyle_2;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 4 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:580:5: this_PropertyTextStyle_3= rulePropertyTextStyle
+                    // InternalGridSource.g:581:3: this_PropertyTextStyle_3= rulePropertyTextStyle
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyTextStyleParserRuleCall_3()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyTextStyleParserRuleCall_3());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyTextStyle_in_rulePropertyStyle1178);
+                    pushFollow(FOLLOW_2);
                     this_PropertyTextStyle_3=rulePropertyTextStyle();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyTextStyle_3; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyTextStyle_3;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 5 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:590:5: this_PropertyBooleanStyle_4= rulePropertyBooleanStyle
+                    // InternalGridSource.g:590:3: this_PropertyBooleanStyle_4= rulePropertyBooleanStyle
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyBooleanStyleParserRuleCall_4()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyBooleanStyleParserRuleCall_4());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyBooleanStyle_in_rulePropertyStyle1205);
+                    pushFollow(FOLLOW_2);
                     this_PropertyBooleanStyle_4=rulePropertyBooleanStyle();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyBooleanStyle_4; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyBooleanStyle_4;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 6 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:600:5: this_PropertyDateStyle_5= rulePropertyDateStyle
+                    // InternalGridSource.g:599:3: this_PropertyDateStyle_5= rulePropertyDateStyle
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyDateStyleParserRuleCall_5()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyDateStyleParserRuleCall_5());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyDateStyle_in_rulePropertyStyle1232);
+                    pushFollow(FOLLOW_2);
                     this_PropertyDateStyle_5=rulePropertyDateStyle();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyDateStyle_5; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyDateStyle_5;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 7 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:610:5: this_PropertyNumberStyle_6= rulePropertyNumberStyle
+                    // InternalGridSource.g:608:3: this_PropertyNumberStyle_6= rulePropertyNumberStyle
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyNumberStyleParserRuleCall_6()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyNumberStyleParserRuleCall_6());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyNumberStyle_in_rulePropertyStyle1259);
+                    pushFollow(FOLLOW_2);
                     this_PropertyNumberStyle_6=rulePropertyNumberStyle();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyNumberStyle_6; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyNumberStyle_6;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 8 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:620:5: this_PropertyImageStyle_7= rulePropertyImageStyle
+                    // InternalGridSource.g:617:3: this_PropertyImageStyle_7= rulePropertyImageStyle
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyImageStyleParserRuleCall_7()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyImageStyleParserRuleCall_7());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyImageStyle_in_rulePropertyStyle1286);
+                    pushFollow(FOLLOW_2);
                     this_PropertyImageStyle_7=rulePropertyImageStyle();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyImageStyle_7; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyImageStyle_7;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 9 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:630:5: this_PropertyQuantityStyle_8= rulePropertyQuantityStyle
+                    // InternalGridSource.g:626:3: this_PropertyQuantityStyle_8= rulePropertyQuantityStyle
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyQuantityStyleParserRuleCall_8()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyQuantityStyleParserRuleCall_8());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyQuantityStyle_in_rulePropertyStyle1313);
+                    pushFollow(FOLLOW_2);
                     this_PropertyQuantityStyle_8=rulePropertyQuantityStyle();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyQuantityStyle_8; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyQuantityStyle_8;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 10 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:640:5: this_PropertyPriceStyle_9= rulePropertyPriceStyle
+                    // InternalGridSource.g:635:3: this_PropertyPriceStyle_9= rulePropertyPriceStyle
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyPriceStyleParserRuleCall_9()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyPriceStyleParserRuleCall_9());
+                      		
                     }
-                    pushFollow(FOLLOW_rulePropertyPriceStyle_in_rulePropertyStyle1340);
+                    pushFollow(FOLLOW_2);
                     this_PropertyPriceStyle_9=rulePropertyPriceStyle();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_PropertyPriceStyle_9; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_PropertyPriceStyle_9;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 11 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:650:5: this_GridPropIndicatorStyle_10= ruleGridPropIndicatorStyle
+                    // InternalGridSource.g:644:3: this_GridPropIndicatorStyle_10= ruleGridPropIndicatorStyle
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getGridPropIndicatorStyleParserRuleCall_10()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getPropertyStyleAccess().getGridPropIndicatorStyleParserRuleCall_10());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleGridPropIndicatorStyle_in_rulePropertyStyle1367);
+                    pushFollow(FOLLOW_2);
                     this_GridPropIndicatorStyle_10=ruleGridPropIndicatorStyle();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_GridPropIndicatorStyle_10; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_GridPropIndicatorStyle_10;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
@@ -1766,14 +1773,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1782,7 +1791,7 @@
 
 
     // $ANTLR start "entryRulePropertyButtonStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:666:1: entryRulePropertyButtonStyle returns [EObject current=null] : iv_rulePropertyButtonStyle= rulePropertyButtonStyle EOF ;
+    // InternalGridSource.g:656:1: entryRulePropertyButtonStyle returns [EObject current=null] : iv_rulePropertyButtonStyle= rulePropertyButtonStyle EOF ;
     public final EObject entryRulePropertyButtonStyle() throws RecognitionException {
         EObject current = null;
 
@@ -1790,13 +1799,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:667:2: (iv_rulePropertyButtonStyle= rulePropertyButtonStyle EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:668:2: iv_rulePropertyButtonStyle= rulePropertyButtonStyle EOF
+            // InternalGridSource.g:656:60: (iv_rulePropertyButtonStyle= rulePropertyButtonStyle EOF )
+            // InternalGridSource.g:657:2: iv_rulePropertyButtonStyle= rulePropertyButtonStyle EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyButtonStyleRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyButtonStyle_in_entryRulePropertyButtonStyle1402);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyButtonStyle=rulePropertyButtonStyle();
 
             state._fsp--;
@@ -1804,16 +1813,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyButtonStyle; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyButtonStyle1412); 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;
@@ -1822,7 +1831,7 @@
 
 
     // $ANTLR start "rulePropertyButtonStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:675:1: rulePropertyButtonStyle returns [EObject current=null] : ( () otherlv_1= 'buttonStyle' otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) ) ;
+    // InternalGridSource.g:663:1: rulePropertyButtonStyle returns [EObject current=null] : ( () otherlv_1= 'buttonStyle' otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) ) ;
     public final EObject rulePropertyButtonStyle() throws RecognitionException {
         EObject current = null;
 
@@ -1830,63 +1839,64 @@
         Token otherlv_2=null;
         Token lv_eventTopic_3_0=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:678:28: ( ( () otherlv_1= 'buttonStyle' otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:679:1: ( () otherlv_1= 'buttonStyle' otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )
+            // InternalGridSource.g:669:2: ( ( () otherlv_1= 'buttonStyle' otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) ) )
+            // InternalGridSource.g:670:2: ( () otherlv_1= 'buttonStyle' otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:679:1: ( () otherlv_1= 'buttonStyle' otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:679:2: () otherlv_1= 'buttonStyle' otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) )
+            // InternalGridSource.g:670:2: ( () otherlv_1= 'buttonStyle' otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )
+            // InternalGridSource.g:671:3: () otherlv_1= 'buttonStyle' otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:679:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:680:5: 
+            // InternalGridSource.g:671:3: ()
+            // InternalGridSource.g:672:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyButtonStyleAccess().getCxGridPropButtonStyleAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyButtonStyleAccess().getCxGridPropButtonStyleAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,27,FOLLOW_27_in_rulePropertyButtonStyle1458); if (state.failed) return current;
+            otherlv_1=(Token)match(input,27,FOLLOW_18); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyButtonStyleAccess().getButtonStyleKeyword_1());
-                  
-            }
-            otherlv_2=(Token)match(input,28,FOLLOW_28_in_rulePropertyButtonStyle1470); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_2, grammarAccess.getPropertyButtonStyleAccess().getEventTopicKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:693:1: ( (lv_eventTopic_3_0= RULE_STRING ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:694:1: (lv_eventTopic_3_0= RULE_STRING )
-            {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:694:1: (lv_eventTopic_3_0= RULE_STRING )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:695:3: lv_eventTopic_3_0= RULE_STRING
-            {
-            lv_eventTopic_3_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rulePropertyButtonStyle1487); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_eventTopic_3_0, grammarAccess.getPropertyButtonStyleAccess().getEventTopicSTRINGTerminalRuleCall_3_0()); 
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyButtonStyleAccess().getButtonStyleKeyword_1());
               		
             }
+            otherlv_2=(Token)match(input,28,FOLLOW_19); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getPropertyButtonStyleRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"eventTopic",
-                      		lv_eventTopic_3_0, 
-                      		"STRING");
-              	    
+              			newLeafNode(otherlv_2, grammarAccess.getPropertyButtonStyleAccess().getEventTopicKeyword_2());
+              		
+            }
+            // InternalGridSource.g:686:3: ( (lv_eventTopic_3_0= RULE_STRING ) )
+            // InternalGridSource.g:687:4: (lv_eventTopic_3_0= RULE_STRING )
+            {
+            // InternalGridSource.g:687:4: (lv_eventTopic_3_0= RULE_STRING )
+            // InternalGridSource.g:688:5: lv_eventTopic_3_0= RULE_STRING
+            {
+            lv_eventTopic_3_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_eventTopic_3_0, grammarAccess.getPropertyButtonStyleAccess().getEventTopicSTRINGTerminalRuleCall_3_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getPropertyButtonStyleRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"eventTopic",
+              						lv_eventTopic_3_0,
+              						"org.eclipse.xtext.xbase.Xtype.STRING");
+              				
             }
 
             }
@@ -1901,14 +1911,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -1917,7 +1929,7 @@
 
 
     // $ANTLR start "entryRulePropertyHtmlStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:719:1: entryRulePropertyHtmlStyle returns [EObject current=null] : iv_rulePropertyHtmlStyle= rulePropertyHtmlStyle EOF ;
+    // InternalGridSource.g:708:1: entryRulePropertyHtmlStyle returns [EObject current=null] : iv_rulePropertyHtmlStyle= rulePropertyHtmlStyle EOF ;
     public final EObject entryRulePropertyHtmlStyle() throws RecognitionException {
         EObject current = null;
 
@@ -1925,13 +1937,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:720:2: (iv_rulePropertyHtmlStyle= rulePropertyHtmlStyle EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:721:2: iv_rulePropertyHtmlStyle= rulePropertyHtmlStyle EOF
+            // InternalGridSource.g:708:58: (iv_rulePropertyHtmlStyle= rulePropertyHtmlStyle EOF )
+            // InternalGridSource.g:709:2: iv_rulePropertyHtmlStyle= rulePropertyHtmlStyle EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyHtmlStyleRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyHtmlStyle_in_entryRulePropertyHtmlStyle1528);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyHtmlStyle=rulePropertyHtmlStyle();
 
             state._fsp--;
@@ -1939,16 +1951,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyHtmlStyle; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyHtmlStyle1538); 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;
@@ -1957,39 +1969,40 @@
 
 
     // $ANTLR start "rulePropertyHtmlStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:728:1: rulePropertyHtmlStyle returns [EObject current=null] : ( () otherlv_1= 'htmlStyle' ) ;
+    // InternalGridSource.g:715:1: rulePropertyHtmlStyle returns [EObject current=null] : ( () otherlv_1= 'htmlStyle' ) ;
     public final EObject rulePropertyHtmlStyle() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_1=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:731:28: ( ( () otherlv_1= 'htmlStyle' ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:732:1: ( () otherlv_1= 'htmlStyle' )
+            // InternalGridSource.g:721:2: ( ( () otherlv_1= 'htmlStyle' ) )
+            // InternalGridSource.g:722:2: ( () otherlv_1= 'htmlStyle' )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:732:1: ( () otherlv_1= 'htmlStyle' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:732:2: () otherlv_1= 'htmlStyle'
+            // InternalGridSource.g:722:2: ( () otherlv_1= 'htmlStyle' )
+            // InternalGridSource.g:723:3: () otherlv_1= 'htmlStyle'
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:732:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:733:5: 
+            // InternalGridSource.g:723:3: ()
+            // InternalGridSource.g:724:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyHtmlStyleAccess().getCxGridPropHtmlStyleAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyHtmlStyleAccess().getCxGridPropHtmlStyleAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,29,FOLLOW_29_in_rulePropertyHtmlStyle1584); if (state.failed) return current;
+            otherlv_1=(Token)match(input,29,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyHtmlStyleAccess().getHtmlStyleKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyHtmlStyleAccess().getHtmlStyleKeyword_1());
+              		
             }
 
             }
@@ -1998,14 +2011,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2014,7 +2029,7 @@
 
 
     // $ANTLR start "entryRulePropertyBooleanStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:750:1: entryRulePropertyBooleanStyle returns [EObject current=null] : iv_rulePropertyBooleanStyle= rulePropertyBooleanStyle EOF ;
+    // InternalGridSource.g:738:1: entryRulePropertyBooleanStyle returns [EObject current=null] : iv_rulePropertyBooleanStyle= rulePropertyBooleanStyle EOF ;
     public final EObject entryRulePropertyBooleanStyle() throws RecognitionException {
         EObject current = null;
 
@@ -2022,13 +2037,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:751:2: (iv_rulePropertyBooleanStyle= rulePropertyBooleanStyle EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:752:2: iv_rulePropertyBooleanStyle= rulePropertyBooleanStyle EOF
+            // InternalGridSource.g:738:61: (iv_rulePropertyBooleanStyle= rulePropertyBooleanStyle EOF )
+            // InternalGridSource.g:739:2: iv_rulePropertyBooleanStyle= rulePropertyBooleanStyle EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyBooleanStyleRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyBooleanStyle_in_entryRulePropertyBooleanStyle1620);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyBooleanStyle=rulePropertyBooleanStyle();
 
             state._fsp--;
@@ -2036,16 +2051,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyBooleanStyle; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyBooleanStyle1630); 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;
@@ -2054,39 +2069,40 @@
 
 
     // $ANTLR start "rulePropertyBooleanStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:759:1: rulePropertyBooleanStyle returns [EObject current=null] : ( () otherlv_1= 'boolStyle' ) ;
+    // InternalGridSource.g:745:1: rulePropertyBooleanStyle returns [EObject current=null] : ( () otherlv_1= 'boolStyle' ) ;
     public final EObject rulePropertyBooleanStyle() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_1=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:762:28: ( ( () otherlv_1= 'boolStyle' ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:763:1: ( () otherlv_1= 'boolStyle' )
+            // InternalGridSource.g:751:2: ( ( () otherlv_1= 'boolStyle' ) )
+            // InternalGridSource.g:752:2: ( () otherlv_1= 'boolStyle' )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:763:1: ( () otherlv_1= 'boolStyle' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:763:2: () otherlv_1= 'boolStyle'
+            // InternalGridSource.g:752:2: ( () otherlv_1= 'boolStyle' )
+            // InternalGridSource.g:753:3: () otherlv_1= 'boolStyle'
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:763:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:764:5: 
+            // InternalGridSource.g:753:3: ()
+            // InternalGridSource.g:754:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyBooleanStyleAccess().getCxGridPropBooleanStyleAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyBooleanStyleAccess().getCxGridPropBooleanStyleAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,30,FOLLOW_30_in_rulePropertyBooleanStyle1676); if (state.failed) return current;
+            otherlv_1=(Token)match(input,30,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyBooleanStyleAccess().getBoolStyleKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyBooleanStyleAccess().getBoolStyleKeyword_1());
+              		
             }
 
             }
@@ -2095,14 +2111,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2111,7 +2129,7 @@
 
 
     // $ANTLR start "entryRulePropertyDateStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:781:1: entryRulePropertyDateStyle returns [EObject current=null] : iv_rulePropertyDateStyle= rulePropertyDateStyle EOF ;
+    // InternalGridSource.g:768:1: entryRulePropertyDateStyle returns [EObject current=null] : iv_rulePropertyDateStyle= rulePropertyDateStyle EOF ;
     public final EObject entryRulePropertyDateStyle() throws RecognitionException {
         EObject current = null;
 
@@ -2119,13 +2137,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:782:2: (iv_rulePropertyDateStyle= rulePropertyDateStyle EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:783:2: iv_rulePropertyDateStyle= rulePropertyDateStyle EOF
+            // InternalGridSource.g:768:58: (iv_rulePropertyDateStyle= rulePropertyDateStyle EOF )
+            // InternalGridSource.g:769:2: iv_rulePropertyDateStyle= rulePropertyDateStyle EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyDateStyleRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyDateStyle_in_entryRulePropertyDateStyle1712);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyDateStyle=rulePropertyDateStyle();
 
             state._fsp--;
@@ -2133,16 +2151,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyDateStyle; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyDateStyle1722); 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;
@@ -2151,7 +2169,7 @@
 
 
     // $ANTLR start "rulePropertyDateStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:790:1: rulePropertyDateStyle returns [EObject current=null] : ( () otherlv_1= 'dateStyle' otherlv_2= 'format' ( (lv_dateFormat_3_0= RULE_STRING ) ) ) ;
+    // InternalGridSource.g:775:1: rulePropertyDateStyle returns [EObject current=null] : ( () otherlv_1= 'dateStyle' otherlv_2= 'format' ( (lv_dateFormat_3_0= RULE_STRING ) ) ) ;
     public final EObject rulePropertyDateStyle() throws RecognitionException {
         EObject current = null;
 
@@ -2159,63 +2177,64 @@
         Token otherlv_2=null;
         Token lv_dateFormat_3_0=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:793:28: ( ( () otherlv_1= 'dateStyle' otherlv_2= 'format' ( (lv_dateFormat_3_0= RULE_STRING ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:794:1: ( () otherlv_1= 'dateStyle' otherlv_2= 'format' ( (lv_dateFormat_3_0= RULE_STRING ) ) )
+            // InternalGridSource.g:781:2: ( ( () otherlv_1= 'dateStyle' otherlv_2= 'format' ( (lv_dateFormat_3_0= RULE_STRING ) ) ) )
+            // InternalGridSource.g:782:2: ( () otherlv_1= 'dateStyle' otherlv_2= 'format' ( (lv_dateFormat_3_0= RULE_STRING ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:794:1: ( () otherlv_1= 'dateStyle' otherlv_2= 'format' ( (lv_dateFormat_3_0= RULE_STRING ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:794:2: () otherlv_1= 'dateStyle' otherlv_2= 'format' ( (lv_dateFormat_3_0= RULE_STRING ) )
+            // InternalGridSource.g:782:2: ( () otherlv_1= 'dateStyle' otherlv_2= 'format' ( (lv_dateFormat_3_0= RULE_STRING ) ) )
+            // InternalGridSource.g:783:3: () otherlv_1= 'dateStyle' otherlv_2= 'format' ( (lv_dateFormat_3_0= RULE_STRING ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:794:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:795:5: 
+            // InternalGridSource.g:783:3: ()
+            // InternalGridSource.g:784:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyDateStyleAccess().getCxGridPropDateStyleAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyDateStyleAccess().getCxGridPropDateStyleAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,31,FOLLOW_31_in_rulePropertyDateStyle1768); if (state.failed) return current;
+            otherlv_1=(Token)match(input,31,FOLLOW_20); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyDateStyleAccess().getDateStyleKeyword_1());
-                  
-            }
-            otherlv_2=(Token)match(input,32,FOLLOW_32_in_rulePropertyDateStyle1780); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_2, grammarAccess.getPropertyDateStyleAccess().getFormatKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:808:1: ( (lv_dateFormat_3_0= RULE_STRING ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:809:1: (lv_dateFormat_3_0= RULE_STRING )
-            {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:809:1: (lv_dateFormat_3_0= RULE_STRING )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:810:3: lv_dateFormat_3_0= RULE_STRING
-            {
-            lv_dateFormat_3_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rulePropertyDateStyle1797); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_dateFormat_3_0, grammarAccess.getPropertyDateStyleAccess().getDateFormatSTRINGTerminalRuleCall_3_0()); 
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyDateStyleAccess().getDateStyleKeyword_1());
               		
             }
+            otherlv_2=(Token)match(input,32,FOLLOW_19); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getPropertyDateStyleRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"dateFormat",
-                      		lv_dateFormat_3_0, 
-                      		"STRING");
-              	    
+              			newLeafNode(otherlv_2, grammarAccess.getPropertyDateStyleAccess().getFormatKeyword_2());
+              		
+            }
+            // InternalGridSource.g:798:3: ( (lv_dateFormat_3_0= RULE_STRING ) )
+            // InternalGridSource.g:799:4: (lv_dateFormat_3_0= RULE_STRING )
+            {
+            // InternalGridSource.g:799:4: (lv_dateFormat_3_0= RULE_STRING )
+            // InternalGridSource.g:800:5: lv_dateFormat_3_0= RULE_STRING
+            {
+            lv_dateFormat_3_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_dateFormat_3_0, grammarAccess.getPropertyDateStyleAccess().getDateFormatSTRINGTerminalRuleCall_3_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getPropertyDateStyleRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"dateFormat",
+              						lv_dateFormat_3_0,
+              						"org.eclipse.xtext.xbase.Xtype.STRING");
+              				
             }
 
             }
@@ -2230,14 +2249,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2246,7 +2267,7 @@
 
 
     // $ANTLR start "entryRulePropertyNumberStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:834:1: entryRulePropertyNumberStyle returns [EObject current=null] : iv_rulePropertyNumberStyle= rulePropertyNumberStyle EOF ;
+    // InternalGridSource.g:820:1: entryRulePropertyNumberStyle returns [EObject current=null] : iv_rulePropertyNumberStyle= rulePropertyNumberStyle EOF ;
     public final EObject entryRulePropertyNumberStyle() throws RecognitionException {
         EObject current = null;
 
@@ -2254,13 +2275,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:835:2: (iv_rulePropertyNumberStyle= rulePropertyNumberStyle EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:836:2: iv_rulePropertyNumberStyle= rulePropertyNumberStyle EOF
+            // InternalGridSource.g:820:60: (iv_rulePropertyNumberStyle= rulePropertyNumberStyle EOF )
+            // InternalGridSource.g:821:2: iv_rulePropertyNumberStyle= rulePropertyNumberStyle EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyNumberStyleRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyNumberStyle_in_entryRulePropertyNumberStyle1838);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyNumberStyle=rulePropertyNumberStyle();
 
             state._fsp--;
@@ -2268,16 +2289,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyNumberStyle; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyNumberStyle1848); 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;
@@ -2286,7 +2307,7 @@
 
 
     // $ANTLR start "rulePropertyNumberStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:843:1: rulePropertyNumberStyle returns [EObject current=null] : ( () otherlv_1= 'numberStyle' otherlv_2= 'format' ( (lv_numberFormat_3_0= RULE_STRING ) ) ) ;
+    // InternalGridSource.g:827:1: rulePropertyNumberStyle returns [EObject current=null] : ( () otherlv_1= 'numberStyle' otherlv_2= 'format' ( (lv_numberFormat_3_0= RULE_STRING ) ) ) ;
     public final EObject rulePropertyNumberStyle() throws RecognitionException {
         EObject current = null;
 
@@ -2294,63 +2315,64 @@
         Token otherlv_2=null;
         Token lv_numberFormat_3_0=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:846:28: ( ( () otherlv_1= 'numberStyle' otherlv_2= 'format' ( (lv_numberFormat_3_0= RULE_STRING ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:847:1: ( () otherlv_1= 'numberStyle' otherlv_2= 'format' ( (lv_numberFormat_3_0= RULE_STRING ) ) )
+            // InternalGridSource.g:833:2: ( ( () otherlv_1= 'numberStyle' otherlv_2= 'format' ( (lv_numberFormat_3_0= RULE_STRING ) ) ) )
+            // InternalGridSource.g:834:2: ( () otherlv_1= 'numberStyle' otherlv_2= 'format' ( (lv_numberFormat_3_0= RULE_STRING ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:847:1: ( () otherlv_1= 'numberStyle' otherlv_2= 'format' ( (lv_numberFormat_3_0= RULE_STRING ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:847:2: () otherlv_1= 'numberStyle' otherlv_2= 'format' ( (lv_numberFormat_3_0= RULE_STRING ) )
+            // InternalGridSource.g:834:2: ( () otherlv_1= 'numberStyle' otherlv_2= 'format' ( (lv_numberFormat_3_0= RULE_STRING ) ) )
+            // InternalGridSource.g:835:3: () otherlv_1= 'numberStyle' otherlv_2= 'format' ( (lv_numberFormat_3_0= RULE_STRING ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:847:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:848:5: 
+            // InternalGridSource.g:835:3: ()
+            // InternalGridSource.g:836:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyNumberStyleAccess().getCxGridPropNumberStyleAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyNumberStyleAccess().getCxGridPropNumberStyleAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,33,FOLLOW_33_in_rulePropertyNumberStyle1894); if (state.failed) return current;
+            otherlv_1=(Token)match(input,33,FOLLOW_20); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyNumberStyleAccess().getNumberStyleKeyword_1());
-                  
-            }
-            otherlv_2=(Token)match(input,32,FOLLOW_32_in_rulePropertyNumberStyle1906); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_2, grammarAccess.getPropertyNumberStyleAccess().getFormatKeyword_2());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:861:1: ( (lv_numberFormat_3_0= RULE_STRING ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:862:1: (lv_numberFormat_3_0= RULE_STRING )
-            {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:862:1: (lv_numberFormat_3_0= RULE_STRING )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:863:3: lv_numberFormat_3_0= RULE_STRING
-            {
-            lv_numberFormat_3_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rulePropertyNumberStyle1923); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_numberFormat_3_0, grammarAccess.getPropertyNumberStyleAccess().getNumberFormatSTRINGTerminalRuleCall_3_0()); 
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyNumberStyleAccess().getNumberStyleKeyword_1());
               		
             }
+            otherlv_2=(Token)match(input,32,FOLLOW_19); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getPropertyNumberStyleRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"numberFormat",
-                      		lv_numberFormat_3_0, 
-                      		"STRING");
-              	    
+              			newLeafNode(otherlv_2, grammarAccess.getPropertyNumberStyleAccess().getFormatKeyword_2());
+              		
+            }
+            // InternalGridSource.g:850:3: ( (lv_numberFormat_3_0= RULE_STRING ) )
+            // InternalGridSource.g:851:4: (lv_numberFormat_3_0= RULE_STRING )
+            {
+            // InternalGridSource.g:851:4: (lv_numberFormat_3_0= RULE_STRING )
+            // InternalGridSource.g:852:5: lv_numberFormat_3_0= RULE_STRING
+            {
+            lv_numberFormat_3_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_numberFormat_3_0, grammarAccess.getPropertyNumberStyleAccess().getNumberFormatSTRINGTerminalRuleCall_3_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getPropertyNumberStyleRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"numberFormat",
+              						lv_numberFormat_3_0,
+              						"org.eclipse.xtext.xbase.Xtype.STRING");
+              				
             }
 
             }
@@ -2365,14 +2387,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2381,7 +2405,7 @@
 
 
     // $ANTLR start "entryRulePropertyProgressbarStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:887:1: entryRulePropertyProgressbarStyle returns [EObject current=null] : iv_rulePropertyProgressbarStyle= rulePropertyProgressbarStyle EOF ;
+    // InternalGridSource.g:872:1: entryRulePropertyProgressbarStyle returns [EObject current=null] : iv_rulePropertyProgressbarStyle= rulePropertyProgressbarStyle EOF ;
     public final EObject entryRulePropertyProgressbarStyle() throws RecognitionException {
         EObject current = null;
 
@@ -2389,13 +2413,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:888:2: (iv_rulePropertyProgressbarStyle= rulePropertyProgressbarStyle EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:889:2: iv_rulePropertyProgressbarStyle= rulePropertyProgressbarStyle EOF
+            // InternalGridSource.g:872:65: (iv_rulePropertyProgressbarStyle= rulePropertyProgressbarStyle EOF )
+            // InternalGridSource.g:873:2: iv_rulePropertyProgressbarStyle= rulePropertyProgressbarStyle EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyProgressbarStyleRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyProgressbarStyle_in_entryRulePropertyProgressbarStyle1964);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyProgressbarStyle=rulePropertyProgressbarStyle();
 
             state._fsp--;
@@ -2403,16 +2427,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyProgressbarStyle; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyProgressbarStyle1974); 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;
@@ -2421,7 +2445,7 @@
 
 
     // $ANTLR start "rulePropertyProgressbarStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:896:1: rulePropertyProgressbarStyle returns [EObject current=null] : ( () otherlv_1= 'progressbarStyle' otherlv_2= 'max' ( (lv_maxValue_3_0= ruleLDouble ) ) ) ;
+    // InternalGridSource.g:879:1: rulePropertyProgressbarStyle returns [EObject current=null] : ( () otherlv_1= 'progressbarStyle' otherlv_2= 'max' ( (lv_maxValue_3_0= ruleLDouble ) ) ) ;
     public final EObject rulePropertyProgressbarStyle() throws RecognitionException {
         EObject current = null;
 
@@ -2430,68 +2454,69 @@
         AntlrDatatypeRuleToken lv_maxValue_3_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:899:28: ( ( () otherlv_1= 'progressbarStyle' otherlv_2= 'max' ( (lv_maxValue_3_0= ruleLDouble ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:900:1: ( () otherlv_1= 'progressbarStyle' otherlv_2= 'max' ( (lv_maxValue_3_0= ruleLDouble ) ) )
+            // InternalGridSource.g:885:2: ( ( () otherlv_1= 'progressbarStyle' otherlv_2= 'max' ( (lv_maxValue_3_0= ruleLDouble ) ) ) )
+            // InternalGridSource.g:886:2: ( () otherlv_1= 'progressbarStyle' otherlv_2= 'max' ( (lv_maxValue_3_0= ruleLDouble ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:900:1: ( () otherlv_1= 'progressbarStyle' otherlv_2= 'max' ( (lv_maxValue_3_0= ruleLDouble ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:900:2: () otherlv_1= 'progressbarStyle' otherlv_2= 'max' ( (lv_maxValue_3_0= ruleLDouble ) )
+            // InternalGridSource.g:886:2: ( () otherlv_1= 'progressbarStyle' otherlv_2= 'max' ( (lv_maxValue_3_0= ruleLDouble ) ) )
+            // InternalGridSource.g:887:3: () otherlv_1= 'progressbarStyle' otherlv_2= 'max' ( (lv_maxValue_3_0= ruleLDouble ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:900:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:901:5: 
+            // InternalGridSource.g:887:3: ()
+            // InternalGridSource.g:888:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyProgressbarStyleAccess().getCxGridPropProgressbarStyleAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyProgressbarStyleAccess().getCxGridPropProgressbarStyleAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,34,FOLLOW_34_in_rulePropertyProgressbarStyle2020); if (state.failed) return current;
+            otherlv_1=(Token)match(input,34,FOLLOW_21); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyProgressbarStyleAccess().getProgressbarStyleKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyProgressbarStyleAccess().getProgressbarStyleKeyword_1());
+              		
             }
-            otherlv_2=(Token)match(input,35,FOLLOW_35_in_rulePropertyProgressbarStyle2032); if (state.failed) return current;
+            otherlv_2=(Token)match(input,35,FOLLOW_22); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getPropertyProgressbarStyleAccess().getMaxKeyword_2());
-                  
+              			newLeafNode(otherlv_2, grammarAccess.getPropertyProgressbarStyleAccess().getMaxKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:914:1: ( (lv_maxValue_3_0= ruleLDouble ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:915:1: (lv_maxValue_3_0= ruleLDouble )
+            // InternalGridSource.g:902:3: ( (lv_maxValue_3_0= ruleLDouble ) )
+            // InternalGridSource.g:903:4: (lv_maxValue_3_0= ruleLDouble )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:915:1: (lv_maxValue_3_0= ruleLDouble )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:916:3: lv_maxValue_3_0= ruleLDouble
+            // InternalGridSource.g:903:4: (lv_maxValue_3_0= ruleLDouble )
+            // InternalGridSource.g:904:5: lv_maxValue_3_0= ruleLDouble
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueLDoubleParserRuleCall_3_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueLDoubleParserRuleCall_3_0());
+              				
             }
-            pushFollow(FOLLOW_ruleLDouble_in_rulePropertyProgressbarStyle2053);
+            pushFollow(FOLLOW_2);
             lv_maxValue_3_0=ruleLDouble();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getPropertyProgressbarStyleRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"maxValue",
-                      		lv_maxValue_3_0, 
-                      		"LDouble");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPropertyProgressbarStyleRule());
+              					}
+              					set(
+              						current,
+              						"maxValue",
+              						lv_maxValue_3_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.LDouble");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -2506,14 +2531,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2522,7 +2549,7 @@
 
 
     // $ANTLR start "entryRuleGridPropIndicatorStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:940:1: entryRuleGridPropIndicatorStyle returns [EObject current=null] : iv_ruleGridPropIndicatorStyle= ruleGridPropIndicatorStyle EOF ;
+    // InternalGridSource.g:925:1: entryRuleGridPropIndicatorStyle returns [EObject current=null] : iv_ruleGridPropIndicatorStyle= ruleGridPropIndicatorStyle EOF ;
     public final EObject entryRuleGridPropIndicatorStyle() throws RecognitionException {
         EObject current = null;
 
@@ -2530,13 +2557,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:941:2: (iv_ruleGridPropIndicatorStyle= ruleGridPropIndicatorStyle EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:942:2: iv_ruleGridPropIndicatorStyle= ruleGridPropIndicatorStyle EOF
+            // InternalGridSource.g:925:63: (iv_ruleGridPropIndicatorStyle= ruleGridPropIndicatorStyle EOF )
+            // InternalGridSource.g:926:2: iv_ruleGridPropIndicatorStyle= ruleGridPropIndicatorStyle EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getGridPropIndicatorStyleRule()); 
             }
-            pushFollow(FOLLOW_ruleGridPropIndicatorStyle_in_entryRuleGridPropIndicatorStyle2089);
+            pushFollow(FOLLOW_1);
             iv_ruleGridPropIndicatorStyle=ruleGridPropIndicatorStyle();
 
             state._fsp--;
@@ -2544,16 +2571,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleGridPropIndicatorStyle; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleGridPropIndicatorStyle2099); 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;
@@ -2562,7 +2589,7 @@
 
 
     // $ANTLR start "ruleGridPropIndicatorStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:949:1: ruleGridPropIndicatorStyle returns [EObject current=null] : ( () otherlv_1= 'indicatorStyle' otherlv_2= 'greenFrom' ( (lv_greenStarts_3_0= ruleLDouble ) ) otherlv_4= 'redUntil' ( (lv_redEnds_5_0= ruleLDouble ) ) ) ;
+    // InternalGridSource.g:932:1: ruleGridPropIndicatorStyle returns [EObject current=null] : ( () otherlv_1= 'indicatorStyle' otherlv_2= 'greenFrom' ( (lv_greenStarts_3_0= ruleLDouble ) ) otherlv_4= 'redUntil' ( (lv_redEnds_5_0= ruleLDouble ) ) ) ;
     public final EObject ruleGridPropIndicatorStyle() throws RecognitionException {
         EObject current = null;
 
@@ -2574,68 +2601,69 @@
         AntlrDatatypeRuleToken lv_redEnds_5_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:952:28: ( ( () otherlv_1= 'indicatorStyle' otherlv_2= 'greenFrom' ( (lv_greenStarts_3_0= ruleLDouble ) ) otherlv_4= 'redUntil' ( (lv_redEnds_5_0= ruleLDouble ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:953:1: ( () otherlv_1= 'indicatorStyle' otherlv_2= 'greenFrom' ( (lv_greenStarts_3_0= ruleLDouble ) ) otherlv_4= 'redUntil' ( (lv_redEnds_5_0= ruleLDouble ) ) )
+            // InternalGridSource.g:938:2: ( ( () otherlv_1= 'indicatorStyle' otherlv_2= 'greenFrom' ( (lv_greenStarts_3_0= ruleLDouble ) ) otherlv_4= 'redUntil' ( (lv_redEnds_5_0= ruleLDouble ) ) ) )
+            // InternalGridSource.g:939:2: ( () otherlv_1= 'indicatorStyle' otherlv_2= 'greenFrom' ( (lv_greenStarts_3_0= ruleLDouble ) ) otherlv_4= 'redUntil' ( (lv_redEnds_5_0= ruleLDouble ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:953:1: ( () otherlv_1= 'indicatorStyle' otherlv_2= 'greenFrom' ( (lv_greenStarts_3_0= ruleLDouble ) ) otherlv_4= 'redUntil' ( (lv_redEnds_5_0= ruleLDouble ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:953:2: () otherlv_1= 'indicatorStyle' otherlv_2= 'greenFrom' ( (lv_greenStarts_3_0= ruleLDouble ) ) otherlv_4= 'redUntil' ( (lv_redEnds_5_0= ruleLDouble ) )
+            // InternalGridSource.g:939:2: ( () otherlv_1= 'indicatorStyle' otherlv_2= 'greenFrom' ( (lv_greenStarts_3_0= ruleLDouble ) ) otherlv_4= 'redUntil' ( (lv_redEnds_5_0= ruleLDouble ) ) )
+            // InternalGridSource.g:940:3: () otherlv_1= 'indicatorStyle' otherlv_2= 'greenFrom' ( (lv_greenStarts_3_0= ruleLDouble ) ) otherlv_4= 'redUntil' ( (lv_redEnds_5_0= ruleLDouble ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:953:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:954:5: 
+            // InternalGridSource.g:940:3: ()
+            // InternalGridSource.g:941:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getGridPropIndicatorStyleAccess().getCxGridPropIndicatorStyleAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getGridPropIndicatorStyleAccess().getCxGridPropIndicatorStyleAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,36,FOLLOW_36_in_ruleGridPropIndicatorStyle2145); if (state.failed) return current;
+            otherlv_1=(Token)match(input,36,FOLLOW_23); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getGridPropIndicatorStyleAccess().getIndicatorStyleKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getGridPropIndicatorStyleAccess().getIndicatorStyleKeyword_1());
+              		
             }
-            otherlv_2=(Token)match(input,37,FOLLOW_37_in_ruleGridPropIndicatorStyle2157); if (state.failed) return current;
+            otherlv_2=(Token)match(input,37,FOLLOW_22); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_2, grammarAccess.getGridPropIndicatorStyleAccess().getGreenFromKeyword_2());
-                  
+              			newLeafNode(otherlv_2, grammarAccess.getGridPropIndicatorStyleAccess().getGreenFromKeyword_2());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:967:1: ( (lv_greenStarts_3_0= ruleLDouble ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:968:1: (lv_greenStarts_3_0= ruleLDouble )
+            // InternalGridSource.g:955:3: ( (lv_greenStarts_3_0= ruleLDouble ) )
+            // InternalGridSource.g:956:4: (lv_greenStarts_3_0= ruleLDouble )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:968:1: (lv_greenStarts_3_0= ruleLDouble )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:969:3: lv_greenStarts_3_0= ruleLDouble
+            // InternalGridSource.g:956:4: (lv_greenStarts_3_0= ruleLDouble )
+            // InternalGridSource.g:957:5: lv_greenStarts_3_0= ruleLDouble
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsLDoubleParserRuleCall_3_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsLDoubleParserRuleCall_3_0());
+              				
             }
-            pushFollow(FOLLOW_ruleLDouble_in_ruleGridPropIndicatorStyle2178);
+            pushFollow(FOLLOW_24);
             lv_greenStarts_3_0=ruleLDouble();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getGridPropIndicatorStyleRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"greenStarts",
-                      		lv_greenStarts_3_0, 
-                      		"LDouble");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getGridPropIndicatorStyleRule());
+              					}
+              					set(
+              						current,
+              						"greenStarts",
+              						lv_greenStarts_3_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.LDouble");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -2643,40 +2671,40 @@
 
             }
 
-            otherlv_4=(Token)match(input,38,FOLLOW_38_in_ruleGridPropIndicatorStyle2190); if (state.failed) return current;
+            otherlv_4=(Token)match(input,38,FOLLOW_22); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_4, grammarAccess.getGridPropIndicatorStyleAccess().getRedUntilKeyword_4());
-                  
+              			newLeafNode(otherlv_4, grammarAccess.getGridPropIndicatorStyleAccess().getRedUntilKeyword_4());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:989:1: ( (lv_redEnds_5_0= ruleLDouble ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:990:1: (lv_redEnds_5_0= ruleLDouble )
+            // InternalGridSource.g:978:3: ( (lv_redEnds_5_0= ruleLDouble ) )
+            // InternalGridSource.g:979:4: (lv_redEnds_5_0= ruleLDouble )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:990:1: (lv_redEnds_5_0= ruleLDouble )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:991:3: lv_redEnds_5_0= ruleLDouble
+            // InternalGridSource.g:979:4: (lv_redEnds_5_0= ruleLDouble )
+            // InternalGridSource.g:980:5: lv_redEnds_5_0= ruleLDouble
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsLDoubleParserRuleCall_5_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsLDoubleParserRuleCall_5_0());
+              				
             }
-            pushFollow(FOLLOW_ruleLDouble_in_ruleGridPropIndicatorStyle2211);
+            pushFollow(FOLLOW_2);
             lv_redEnds_5_0=ruleLDouble();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getGridPropIndicatorStyleRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"redEnds",
-                      		lv_redEnds_5_0, 
-                      		"LDouble");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getGridPropIndicatorStyleRule());
+              					}
+              					set(
+              						current,
+              						"redEnds",
+              						lv_redEnds_5_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.LDouble");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -2691,14 +2719,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -2707,7 +2737,7 @@
 
 
     // $ANTLR start "entryRulePropertyQuantityStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1015:1: entryRulePropertyQuantityStyle returns [EObject current=null] : iv_rulePropertyQuantityStyle= rulePropertyQuantityStyle EOF ;
+    // InternalGridSource.g:1001:1: entryRulePropertyQuantityStyle returns [EObject current=null] : iv_rulePropertyQuantityStyle= rulePropertyQuantityStyle EOF ;
     public final EObject entryRulePropertyQuantityStyle() throws RecognitionException {
         EObject current = null;
 
@@ -2715,13 +2745,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1016:2: (iv_rulePropertyQuantityStyle= rulePropertyQuantityStyle EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1017:2: iv_rulePropertyQuantityStyle= rulePropertyQuantityStyle EOF
+            // InternalGridSource.g:1001:62: (iv_rulePropertyQuantityStyle= rulePropertyQuantityStyle EOF )
+            // InternalGridSource.g:1002:2: iv_rulePropertyQuantityStyle= rulePropertyQuantityStyle EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyQuantityStyleRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyQuantityStyle_in_entryRulePropertyQuantityStyle2247);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyQuantityStyle=rulePropertyQuantityStyle();
 
             state._fsp--;
@@ -2729,16 +2759,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyQuantityStyle; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyQuantityStyle2257); 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;
@@ -2747,7 +2777,7 @@
 
 
     // $ANTLR start "rulePropertyQuantityStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1024:1: rulePropertyQuantityStyle returns [EObject current=null] : ( () otherlv_1= 'quantityStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'uom' otherlv_11= '=' ( (lv_uomPropertyPath_12_0= ruleNestedField ) ) ) ;
+    // InternalGridSource.g:1008:1: rulePropertyQuantityStyle returns [EObject current=null] : ( () otherlv_1= 'quantityStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'uom' otherlv_11= '=' ( (lv_uomPropertyPath_12_0= ruleNestedField ) ) ) ;
     public final EObject rulePropertyQuantityStyle() throws RecognitionException {
         EObject current = null;
 
@@ -2766,35 +2796,36 @@
         EObject lv_uomPropertyPath_12_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1027:28: ( ( () otherlv_1= 'quantityStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'uom' otherlv_11= '=' ( (lv_uomPropertyPath_12_0= ruleNestedField ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1028:1: ( () otherlv_1= 'quantityStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'uom' otherlv_11= '=' ( (lv_uomPropertyPath_12_0= ruleNestedField ) ) )
+            // InternalGridSource.g:1014:2: ( ( () otherlv_1= 'quantityStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'uom' otherlv_11= '=' ( (lv_uomPropertyPath_12_0= ruleNestedField ) ) ) )
+            // InternalGridSource.g:1015:2: ( () otherlv_1= 'quantityStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'uom' otherlv_11= '=' ( (lv_uomPropertyPath_12_0= ruleNestedField ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1028:1: ( () otherlv_1= 'quantityStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'uom' otherlv_11= '=' ( (lv_uomPropertyPath_12_0= ruleNestedField ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1028:2: () otherlv_1= 'quantityStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'uom' otherlv_11= '=' ( (lv_uomPropertyPath_12_0= ruleNestedField ) )
+            // InternalGridSource.g:1015:2: ( () otherlv_1= 'quantityStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'uom' otherlv_11= '=' ( (lv_uomPropertyPath_12_0= ruleNestedField ) ) )
+            // InternalGridSource.g:1016:3: () otherlv_1= 'quantityStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'uom' otherlv_11= '=' ( (lv_uomPropertyPath_12_0= ruleNestedField ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1028:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1029:5: 
+            // InternalGridSource.g:1016:3: ()
+            // InternalGridSource.g:1017:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyQuantityStyleAccess().getCxGridPropQuantityStyleAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyQuantityStyleAccess().getCxGridPropQuantityStyleAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,39,FOLLOW_39_in_rulePropertyQuantityStyle2303); if (state.failed) return current;
+            otherlv_1=(Token)match(input,39,FOLLOW_25); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyQuantityStyleAccess().getQuantityStyleKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyQuantityStyleAccess().getQuantityStyleKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1038:1: ( (lv_htmlPattern_2_0= RULE_STRING ) )?
+            // InternalGridSource.g:1027:3: ( (lv_htmlPattern_2_0= RULE_STRING ) )?
             int alt7=2;
             int LA7_0 = input.LA(1);
 
@@ -2803,28 +2834,28 @@
             }
             switch (alt7) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1039:1: (lv_htmlPattern_2_0= RULE_STRING )
+                    // InternalGridSource.g:1028:4: (lv_htmlPattern_2_0= RULE_STRING )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1039:1: (lv_htmlPattern_2_0= RULE_STRING )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1040:3: lv_htmlPattern_2_0= RULE_STRING
+                    // InternalGridSource.g:1028:4: (lv_htmlPattern_2_0= RULE_STRING )
+                    // InternalGridSource.g:1029:5: lv_htmlPattern_2_0= RULE_STRING
                     {
-                    lv_htmlPattern_2_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rulePropertyQuantityStyle2320); if (state.failed) return current;
+                    lv_htmlPattern_2_0=(Token)match(input,RULE_STRING,FOLLOW_26); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_htmlPattern_2_0, grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0()); 
-                      		
+                      					newLeafNode(lv_htmlPattern_2_0, grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0());
+                      				
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getPropertyQuantityStyleRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"htmlPattern",
-                              		lv_htmlPattern_2_0, 
-                              		"STRING");
-                      	    
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getPropertyQuantityStyleRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"htmlPattern",
+                      						lv_htmlPattern_2_0,
+                      						"org.eclipse.xtext.xbase.Xtype.STRING");
+                      				
                     }
 
                     }
@@ -2835,46 +2866,46 @@
 
             }
 
-            otherlv_3=(Token)match(input,40,FOLLOW_40_in_rulePropertyQuantityStyle2338); if (state.failed) return current;
+            otherlv_3=(Token)match(input,40,FOLLOW_13); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_3, grammarAccess.getPropertyQuantityStyleAccess().getValueKeyword_3());
-                  
+              			newLeafNode(otherlv_3, grammarAccess.getPropertyQuantityStyleAccess().getValueKeyword_3());
+              		
             }
-            otherlv_4=(Token)match(input,22,FOLLOW_22_in_rulePropertyQuantityStyle2350); if (state.failed) return current;
+            otherlv_4=(Token)match(input,22,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_4, grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_4());
-                  
+              			newLeafNode(otherlv_4, grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_4());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1064:1: ( (lv_valuePropertyPath_5_0= ruleNestedField ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1065:1: (lv_valuePropertyPath_5_0= ruleNestedField )
+            // InternalGridSource.g:1053:3: ( (lv_valuePropertyPath_5_0= ruleNestedField ) )
+            // InternalGridSource.g:1054:4: (lv_valuePropertyPath_5_0= ruleNestedField )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1065:1: (lv_valuePropertyPath_5_0= ruleNestedField )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1066:3: lv_valuePropertyPath_5_0= ruleNestedField
+            // InternalGridSource.g:1054:4: (lv_valuePropertyPath_5_0= ruleNestedField )
+            // InternalGridSource.g:1055:5: lv_valuePropertyPath_5_0= ruleNestedField
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0());
+              				
             }
-            pushFollow(FOLLOW_ruleNestedField_in_rulePropertyQuantityStyle2371);
+            pushFollow(FOLLOW_27);
             lv_valuePropertyPath_5_0=ruleNestedField();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getPropertyQuantityStyleRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"valuePropertyPath",
-                      		lv_valuePropertyPath_5_0, 
-                      		"NestedField");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPropertyQuantityStyleRule());
+              					}
+              					set(
+              						current,
+              						"valuePropertyPath",
+              						lv_valuePropertyPath_5_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -2882,7 +2913,7 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1082:2: (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )?
+            // InternalGridSource.g:1072:3: (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )?
             int alt8=2;
             int LA8_0 = input.LA(1);
 
@@ -2891,43 +2922,43 @@
             }
             switch (alt8) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1082:4: otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')'
+                    // InternalGridSource.g:1073:4: otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')'
                     {
-                    otherlv_6=(Token)match(input,41,FOLLOW_41_in_rulePropertyQuantityStyle2384); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,41,FOLLOW_20); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_6, grammarAccess.getPropertyQuantityStyleAccess().getLeftParenthesisKeyword_6_0());
-                          
+                      				newLeafNode(otherlv_6, grammarAccess.getPropertyQuantityStyleAccess().getLeftParenthesisKeyword_6_0());
+                      			
                     }
-                    otherlv_7=(Token)match(input,32,FOLLOW_32_in_rulePropertyQuantityStyle2396); if (state.failed) return current;
+                    otherlv_7=(Token)match(input,32,FOLLOW_19); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_7, grammarAccess.getPropertyQuantityStyleAccess().getFormatKeyword_6_1());
-                          
+                      				newLeafNode(otherlv_7, grammarAccess.getPropertyQuantityStyleAccess().getFormatKeyword_6_1());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1090:1: ( (lv_valueNumberFormat_8_0= RULE_STRING ) )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1091:1: (lv_valueNumberFormat_8_0= RULE_STRING )
+                    // InternalGridSource.g:1081:4: ( (lv_valueNumberFormat_8_0= RULE_STRING ) )
+                    // InternalGridSource.g:1082:5: (lv_valueNumberFormat_8_0= RULE_STRING )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1091:1: (lv_valueNumberFormat_8_0= RULE_STRING )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1092:3: lv_valueNumberFormat_8_0= RULE_STRING
+                    // InternalGridSource.g:1082:5: (lv_valueNumberFormat_8_0= RULE_STRING )
+                    // InternalGridSource.g:1083:6: lv_valueNumberFormat_8_0= RULE_STRING
                     {
-                    lv_valueNumberFormat_8_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rulePropertyQuantityStyle2413); if (state.failed) return current;
+                    lv_valueNumberFormat_8_0=(Token)match(input,RULE_STRING,FOLLOW_28); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_valueNumberFormat_8_0, grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0()); 
-                      		
+                      						newLeafNode(lv_valueNumberFormat_8_0, grammarAccess.getPropertyQuantityStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getPropertyQuantityStyleRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"valueNumberFormat",
-                              		lv_valueNumberFormat_8_0, 
-                              		"STRING");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getPropertyQuantityStyleRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"valueNumberFormat",
+                      							lv_valueNumberFormat_8_0,
+                      							"org.eclipse.xtext.xbase.Xtype.STRING");
+                      					
                     }
 
                     }
@@ -2935,11 +2966,11 @@
 
                     }
 
-                    otherlv_9=(Token)match(input,42,FOLLOW_42_in_rulePropertyQuantityStyle2430); if (state.failed) return current;
+                    otherlv_9=(Token)match(input,42,FOLLOW_29); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_9, grammarAccess.getPropertyQuantityStyleAccess().getRightParenthesisKeyword_6_3());
-                          
+                      				newLeafNode(otherlv_9, grammarAccess.getPropertyQuantityStyleAccess().getRightParenthesisKeyword_6_3());
+                      			
                     }
 
                     }
@@ -2947,46 +2978,46 @@
 
             }
 
-            otherlv_10=(Token)match(input,43,FOLLOW_43_in_rulePropertyQuantityStyle2444); if (state.failed) return current;
+            otherlv_10=(Token)match(input,43,FOLLOW_13); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_10, grammarAccess.getPropertyQuantityStyleAccess().getUomKeyword_7());
-                  
+              			newLeafNode(otherlv_10, grammarAccess.getPropertyQuantityStyleAccess().getUomKeyword_7());
+              		
             }
-            otherlv_11=(Token)match(input,22,FOLLOW_22_in_rulePropertyQuantityStyle2456); if (state.failed) return current;
+            otherlv_11=(Token)match(input,22,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_11, grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_8());
-                  
+              			newLeafNode(otherlv_11, grammarAccess.getPropertyQuantityStyleAccess().getEqualsSignKeyword_8());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1120:1: ( (lv_uomPropertyPath_12_0= ruleNestedField ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1121:1: (lv_uomPropertyPath_12_0= ruleNestedField )
+            // InternalGridSource.g:1112:3: ( (lv_uomPropertyPath_12_0= ruleNestedField ) )
+            // InternalGridSource.g:1113:4: (lv_uomPropertyPath_12_0= ruleNestedField )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1121:1: (lv_uomPropertyPath_12_0= ruleNestedField )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1122:3: lv_uomPropertyPath_12_0= ruleNestedField
+            // InternalGridSource.g:1113:4: (lv_uomPropertyPath_12_0= ruleNestedField )
+            // InternalGridSource.g:1114:5: lv_uomPropertyPath_12_0= ruleNestedField
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathNestedFieldParserRuleCall_9_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathNestedFieldParserRuleCall_9_0());
+              				
             }
-            pushFollow(FOLLOW_ruleNestedField_in_rulePropertyQuantityStyle2477);
+            pushFollow(FOLLOW_2);
             lv_uomPropertyPath_12_0=ruleNestedField();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getPropertyQuantityStyleRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"uomPropertyPath",
-                      		lv_uomPropertyPath_12_0, 
-                      		"NestedField");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPropertyQuantityStyleRule());
+              					}
+              					set(
+              						current,
+              						"uomPropertyPath",
+              						lv_uomPropertyPath_12_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -3001,14 +3032,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3017,7 +3050,7 @@
 
 
     // $ANTLR start "entryRulePropertyPriceStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1146:1: entryRulePropertyPriceStyle returns [EObject current=null] : iv_rulePropertyPriceStyle= rulePropertyPriceStyle EOF ;
+    // InternalGridSource.g:1135:1: entryRulePropertyPriceStyle returns [EObject current=null] : iv_rulePropertyPriceStyle= rulePropertyPriceStyle EOF ;
     public final EObject entryRulePropertyPriceStyle() throws RecognitionException {
         EObject current = null;
 
@@ -3025,13 +3058,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1147:2: (iv_rulePropertyPriceStyle= rulePropertyPriceStyle EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1148:2: iv_rulePropertyPriceStyle= rulePropertyPriceStyle EOF
+            // InternalGridSource.g:1135:59: (iv_rulePropertyPriceStyle= rulePropertyPriceStyle EOF )
+            // InternalGridSource.g:1136:2: iv_rulePropertyPriceStyle= rulePropertyPriceStyle EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyPriceStyleRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyPriceStyle_in_entryRulePropertyPriceStyle2513);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyPriceStyle=rulePropertyPriceStyle();
 
             state._fsp--;
@@ -3039,16 +3072,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyPriceStyle; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyPriceStyle2523); 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;
@@ -3057,7 +3090,7 @@
 
 
     // $ANTLR start "rulePropertyPriceStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1155:1: rulePropertyPriceStyle returns [EObject current=null] : ( () otherlv_1= 'priceStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'currency' otherlv_11= '=' ( (lv_currencyPropertyPath_12_0= ruleNestedField ) ) ) ;
+    // InternalGridSource.g:1142:1: rulePropertyPriceStyle returns [EObject current=null] : ( () otherlv_1= 'priceStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'currency' otherlv_11= '=' ( (lv_currencyPropertyPath_12_0= ruleNestedField ) ) ) ;
     public final EObject rulePropertyPriceStyle() throws RecognitionException {
         EObject current = null;
 
@@ -3076,35 +3109,36 @@
         EObject lv_currencyPropertyPath_12_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1158:28: ( ( () otherlv_1= 'priceStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'currency' otherlv_11= '=' ( (lv_currencyPropertyPath_12_0= ruleNestedField ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1159:1: ( () otherlv_1= 'priceStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'currency' otherlv_11= '=' ( (lv_currencyPropertyPath_12_0= ruleNestedField ) ) )
+            // InternalGridSource.g:1148:2: ( ( () otherlv_1= 'priceStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'currency' otherlv_11= '=' ( (lv_currencyPropertyPath_12_0= ruleNestedField ) ) ) )
+            // InternalGridSource.g:1149:2: ( () otherlv_1= 'priceStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'currency' otherlv_11= '=' ( (lv_currencyPropertyPath_12_0= ruleNestedField ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1159:1: ( () otherlv_1= 'priceStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'currency' otherlv_11= '=' ( (lv_currencyPropertyPath_12_0= ruleNestedField ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1159:2: () otherlv_1= 'priceStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'currency' otherlv_11= '=' ( (lv_currencyPropertyPath_12_0= ruleNestedField ) )
+            // InternalGridSource.g:1149:2: ( () otherlv_1= 'priceStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'currency' otherlv_11= '=' ( (lv_currencyPropertyPath_12_0= ruleNestedField ) ) )
+            // InternalGridSource.g:1150:3: () otherlv_1= 'priceStyle' ( (lv_htmlPattern_2_0= RULE_STRING ) )? otherlv_3= 'value' otherlv_4= '=' ( (lv_valuePropertyPath_5_0= ruleNestedField ) ) (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )? otherlv_10= 'currency' otherlv_11= '=' ( (lv_currencyPropertyPath_12_0= ruleNestedField ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1159:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1160:5: 
+            // InternalGridSource.g:1150:3: ()
+            // InternalGridSource.g:1151:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyPriceStyleAccess().getCxGridPropPriceStyleAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyPriceStyleAccess().getCxGridPropPriceStyleAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,44,FOLLOW_44_in_rulePropertyPriceStyle2569); if (state.failed) return current;
+            otherlv_1=(Token)match(input,44,FOLLOW_25); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyPriceStyleAccess().getPriceStyleKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyPriceStyleAccess().getPriceStyleKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1169:1: ( (lv_htmlPattern_2_0= RULE_STRING ) )?
+            // InternalGridSource.g:1161:3: ( (lv_htmlPattern_2_0= RULE_STRING ) )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -3113,28 +3147,28 @@
             }
             switch (alt9) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1170:1: (lv_htmlPattern_2_0= RULE_STRING )
+                    // InternalGridSource.g:1162:4: (lv_htmlPattern_2_0= RULE_STRING )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1170:1: (lv_htmlPattern_2_0= RULE_STRING )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1171:3: lv_htmlPattern_2_0= RULE_STRING
+                    // InternalGridSource.g:1162:4: (lv_htmlPattern_2_0= RULE_STRING )
+                    // InternalGridSource.g:1163:5: lv_htmlPattern_2_0= RULE_STRING
                     {
-                    lv_htmlPattern_2_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rulePropertyPriceStyle2586); if (state.failed) return current;
+                    lv_htmlPattern_2_0=(Token)match(input,RULE_STRING,FOLLOW_26); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_htmlPattern_2_0, grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0()); 
-                      		
+                      					newLeafNode(lv_htmlPattern_2_0, grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0());
+                      				
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getPropertyPriceStyleRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"htmlPattern",
-                              		lv_htmlPattern_2_0, 
-                              		"STRING");
-                      	    
+                      					if (current==null) {
+                      						current = createModelElement(grammarAccess.getPropertyPriceStyleRule());
+                      					}
+                      					setWithLastConsumed(
+                      						current,
+                      						"htmlPattern",
+                      						lv_htmlPattern_2_0,
+                      						"org.eclipse.xtext.xbase.Xtype.STRING");
+                      				
                     }
 
                     }
@@ -3145,46 +3179,46 @@
 
             }
 
-            otherlv_3=(Token)match(input,40,FOLLOW_40_in_rulePropertyPriceStyle2604); if (state.failed) return current;
+            otherlv_3=(Token)match(input,40,FOLLOW_13); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_3, grammarAccess.getPropertyPriceStyleAccess().getValueKeyword_3());
-                  
+              			newLeafNode(otherlv_3, grammarAccess.getPropertyPriceStyleAccess().getValueKeyword_3());
+              		
             }
-            otherlv_4=(Token)match(input,22,FOLLOW_22_in_rulePropertyPriceStyle2616); if (state.failed) return current;
+            otherlv_4=(Token)match(input,22,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_4, grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_4());
-                  
+              			newLeafNode(otherlv_4, grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_4());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1195:1: ( (lv_valuePropertyPath_5_0= ruleNestedField ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1196:1: (lv_valuePropertyPath_5_0= ruleNestedField )
+            // InternalGridSource.g:1187:3: ( (lv_valuePropertyPath_5_0= ruleNestedField ) )
+            // InternalGridSource.g:1188:4: (lv_valuePropertyPath_5_0= ruleNestedField )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1196:1: (lv_valuePropertyPath_5_0= ruleNestedField )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1197:3: lv_valuePropertyPath_5_0= ruleNestedField
+            // InternalGridSource.g:1188:4: (lv_valuePropertyPath_5_0= ruleNestedField )
+            // InternalGridSource.g:1189:5: lv_valuePropertyPath_5_0= ruleNestedField
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0());
+              				
             }
-            pushFollow(FOLLOW_ruleNestedField_in_rulePropertyPriceStyle2637);
+            pushFollow(FOLLOW_30);
             lv_valuePropertyPath_5_0=ruleNestedField();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getPropertyPriceStyleRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"valuePropertyPath",
-                      		lv_valuePropertyPath_5_0, 
-                      		"NestedField");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPropertyPriceStyleRule());
+              					}
+              					set(
+              						current,
+              						"valuePropertyPath",
+              						lv_valuePropertyPath_5_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -3192,7 +3226,7 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1213:2: (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )?
+            // InternalGridSource.g:1206:3: (otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')' )?
             int alt10=2;
             int LA10_0 = input.LA(1);
 
@@ -3201,43 +3235,43 @@
             }
             switch (alt10) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1213:4: otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')'
+                    // InternalGridSource.g:1207:4: otherlv_6= '(' otherlv_7= 'format' ( (lv_valueNumberFormat_8_0= RULE_STRING ) ) otherlv_9= ')'
                     {
-                    otherlv_6=(Token)match(input,41,FOLLOW_41_in_rulePropertyPriceStyle2650); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,41,FOLLOW_20); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_6, grammarAccess.getPropertyPriceStyleAccess().getLeftParenthesisKeyword_6_0());
-                          
+                      				newLeafNode(otherlv_6, grammarAccess.getPropertyPriceStyleAccess().getLeftParenthesisKeyword_6_0());
+                      			
                     }
-                    otherlv_7=(Token)match(input,32,FOLLOW_32_in_rulePropertyPriceStyle2662); if (state.failed) return current;
+                    otherlv_7=(Token)match(input,32,FOLLOW_19); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_7, grammarAccess.getPropertyPriceStyleAccess().getFormatKeyword_6_1());
-                          
+                      				newLeafNode(otherlv_7, grammarAccess.getPropertyPriceStyleAccess().getFormatKeyword_6_1());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1221:1: ( (lv_valueNumberFormat_8_0= RULE_STRING ) )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1222:1: (lv_valueNumberFormat_8_0= RULE_STRING )
+                    // InternalGridSource.g:1215:4: ( (lv_valueNumberFormat_8_0= RULE_STRING ) )
+                    // InternalGridSource.g:1216:5: (lv_valueNumberFormat_8_0= RULE_STRING )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1222:1: (lv_valueNumberFormat_8_0= RULE_STRING )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1223:3: lv_valueNumberFormat_8_0= RULE_STRING
+                    // InternalGridSource.g:1216:5: (lv_valueNumberFormat_8_0= RULE_STRING )
+                    // InternalGridSource.g:1217:6: lv_valueNumberFormat_8_0= RULE_STRING
                     {
-                    lv_valueNumberFormat_8_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rulePropertyPriceStyle2679); if (state.failed) return current;
+                    lv_valueNumberFormat_8_0=(Token)match(input,RULE_STRING,FOLLOW_28); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_valueNumberFormat_8_0, grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0()); 
-                      		
+                      						newLeafNode(lv_valueNumberFormat_8_0, grammarAccess.getPropertyPriceStyleAccess().getValueNumberFormatSTRINGTerminalRuleCall_6_2_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getPropertyPriceStyleRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"valueNumberFormat",
-                              		lv_valueNumberFormat_8_0, 
-                              		"STRING");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getPropertyPriceStyleRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"valueNumberFormat",
+                      							lv_valueNumberFormat_8_0,
+                      							"org.eclipse.xtext.xbase.Xtype.STRING");
+                      					
                     }
 
                     }
@@ -3245,11 +3279,11 @@
 
                     }
 
-                    otherlv_9=(Token)match(input,42,FOLLOW_42_in_rulePropertyPriceStyle2696); if (state.failed) return current;
+                    otherlv_9=(Token)match(input,42,FOLLOW_31); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_9, grammarAccess.getPropertyPriceStyleAccess().getRightParenthesisKeyword_6_3());
-                          
+                      				newLeafNode(otherlv_9, grammarAccess.getPropertyPriceStyleAccess().getRightParenthesisKeyword_6_3());
+                      			
                     }
 
                     }
@@ -3257,46 +3291,46 @@
 
             }
 
-            otherlv_10=(Token)match(input,45,FOLLOW_45_in_rulePropertyPriceStyle2710); if (state.failed) return current;
+            otherlv_10=(Token)match(input,45,FOLLOW_13); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_10, grammarAccess.getPropertyPriceStyleAccess().getCurrencyKeyword_7());
-                  
+              			newLeafNode(otherlv_10, grammarAccess.getPropertyPriceStyleAccess().getCurrencyKeyword_7());
+              		
             }
-            otherlv_11=(Token)match(input,22,FOLLOW_22_in_rulePropertyPriceStyle2722); if (state.failed) return current;
+            otherlv_11=(Token)match(input,22,FOLLOW_3); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_11, grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_8());
-                  
+              			newLeafNode(otherlv_11, grammarAccess.getPropertyPriceStyleAccess().getEqualsSignKeyword_8());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1251:1: ( (lv_currencyPropertyPath_12_0= ruleNestedField ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1252:1: (lv_currencyPropertyPath_12_0= ruleNestedField )
+            // InternalGridSource.g:1246:3: ( (lv_currencyPropertyPath_12_0= ruleNestedField ) )
+            // InternalGridSource.g:1247:4: (lv_currencyPropertyPath_12_0= ruleNestedField )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1252:1: (lv_currencyPropertyPath_12_0= ruleNestedField )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1253:3: lv_currencyPropertyPath_12_0= ruleNestedField
+            // InternalGridSource.g:1247:4: (lv_currencyPropertyPath_12_0= ruleNestedField )
+            // InternalGridSource.g:1248:5: lv_currencyPropertyPath_12_0= ruleNestedField
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathNestedFieldParserRuleCall_9_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathNestedFieldParserRuleCall_9_0());
+              				
             }
-            pushFollow(FOLLOW_ruleNestedField_in_rulePropertyPriceStyle2743);
+            pushFollow(FOLLOW_2);
             lv_currencyPropertyPath_12_0=ruleNestedField();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getPropertyPriceStyleRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"currencyPropertyPath",
-                      		lv_currencyPropertyPath_12_0, 
-                      		"NestedField");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getPropertyPriceStyleRule());
+              					}
+              					set(
+              						current,
+              						"currencyPropertyPath",
+              						lv_currencyPropertyPath_12_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -3311,14 +3345,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3327,7 +3363,7 @@
 
 
     // $ANTLR start "entryRulePropertyTextStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1277:1: entryRulePropertyTextStyle returns [EObject current=null] : iv_rulePropertyTextStyle= rulePropertyTextStyle EOF ;
+    // InternalGridSource.g:1269:1: entryRulePropertyTextStyle returns [EObject current=null] : iv_rulePropertyTextStyle= rulePropertyTextStyle EOF ;
     public final EObject entryRulePropertyTextStyle() throws RecognitionException {
         EObject current = null;
 
@@ -3335,13 +3371,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1278:2: (iv_rulePropertyTextStyle= rulePropertyTextStyle EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1279:2: iv_rulePropertyTextStyle= rulePropertyTextStyle EOF
+            // InternalGridSource.g:1269:58: (iv_rulePropertyTextStyle= rulePropertyTextStyle EOF )
+            // InternalGridSource.g:1270:2: iv_rulePropertyTextStyle= rulePropertyTextStyle EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyTextStyleRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyTextStyle_in_entryRulePropertyTextStyle2779);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyTextStyle=rulePropertyTextStyle();
 
             state._fsp--;
@@ -3349,16 +3385,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyTextStyle; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyTextStyle2789); 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;
@@ -3367,39 +3403,40 @@
 
 
     // $ANTLR start "rulePropertyTextStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1286:1: rulePropertyTextStyle returns [EObject current=null] : ( () otherlv_1= 'textStyle' ) ;
+    // InternalGridSource.g:1276:1: rulePropertyTextStyle returns [EObject current=null] : ( () otherlv_1= 'textStyle' ) ;
     public final EObject rulePropertyTextStyle() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_1=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1289:28: ( ( () otherlv_1= 'textStyle' ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1290:1: ( () otherlv_1= 'textStyle' )
+            // InternalGridSource.g:1282:2: ( ( () otherlv_1= 'textStyle' ) )
+            // InternalGridSource.g:1283:2: ( () otherlv_1= 'textStyle' )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1290:1: ( () otherlv_1= 'textStyle' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1290:2: () otherlv_1= 'textStyle'
+            // InternalGridSource.g:1283:2: ( () otherlv_1= 'textStyle' )
+            // InternalGridSource.g:1284:3: () otherlv_1= 'textStyle'
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1290:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1291:5: 
+            // InternalGridSource.g:1284:3: ()
+            // InternalGridSource.g:1285:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyTextStyleAccess().getCxGridPropTextStyleAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyTextStyleAccess().getCxGridPropTextStyleAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,46,FOLLOW_46_in_rulePropertyTextStyle2835); if (state.failed) return current;
+            otherlv_1=(Token)match(input,46,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyTextStyleAccess().getTextStyleKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyTextStyleAccess().getTextStyleKeyword_1());
+              		
             }
 
             }
@@ -3408,14 +3445,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3424,7 +3463,7 @@
 
 
     // $ANTLR start "entryRulePropertyImageStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1308:1: entryRulePropertyImageStyle returns [EObject current=null] : iv_rulePropertyImageStyle= rulePropertyImageStyle EOF ;
+    // InternalGridSource.g:1299:1: entryRulePropertyImageStyle returns [EObject current=null] : iv_rulePropertyImageStyle= rulePropertyImageStyle EOF ;
     public final EObject entryRulePropertyImageStyle() throws RecognitionException {
         EObject current = null;
 
@@ -3432,13 +3471,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1309:2: (iv_rulePropertyImageStyle= rulePropertyImageStyle EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1310:2: iv_rulePropertyImageStyle= rulePropertyImageStyle EOF
+            // InternalGridSource.g:1299:59: (iv_rulePropertyImageStyle= rulePropertyImageStyle EOF )
+            // InternalGridSource.g:1300:2: iv_rulePropertyImageStyle= rulePropertyImageStyle EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPropertyImageStyleRule()); 
             }
-            pushFollow(FOLLOW_rulePropertyImageStyle_in_entryRulePropertyImageStyle2871);
+            pushFollow(FOLLOW_1);
             iv_rulePropertyImageStyle=rulePropertyImageStyle();
 
             state._fsp--;
@@ -3446,16 +3485,16 @@
             if ( state.backtracking==0 ) {
                current =iv_rulePropertyImageStyle; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyImageStyle2881); 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;
@@ -3464,7 +3503,7 @@
 
 
     // $ANTLR start "rulePropertyImageStyle"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1317:1: rulePropertyImageStyle returns [EObject current=null] : ( () otherlv_1= 'imageStyle' (otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )? otherlv_4= '{' ( (lv_configs_5_0= ruleStyleConfig ) )* otherlv_6= '}' ) ;
+    // InternalGridSource.g:1306:1: rulePropertyImageStyle returns [EObject current=null] : ( () otherlv_1= 'imageStyle' (otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )? otherlv_4= '{' ( (lv_configs_5_0= ruleStyleConfig ) )* otherlv_6= '}' ) ;
     public final EObject rulePropertyImageStyle() throws RecognitionException {
         EObject current = null;
 
@@ -3476,35 +3515,36 @@
         EObject lv_configs_5_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1320:28: ( ( () otherlv_1= 'imageStyle' (otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )? otherlv_4= '{' ( (lv_configs_5_0= ruleStyleConfig ) )* otherlv_6= '}' ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1321:1: ( () otherlv_1= 'imageStyle' (otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )? otherlv_4= '{' ( (lv_configs_5_0= ruleStyleConfig ) )* otherlv_6= '}' )
+            // InternalGridSource.g:1312:2: ( ( () otherlv_1= 'imageStyle' (otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )? otherlv_4= '{' ( (lv_configs_5_0= ruleStyleConfig ) )* otherlv_6= '}' ) )
+            // InternalGridSource.g:1313:2: ( () otherlv_1= 'imageStyle' (otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )? otherlv_4= '{' ( (lv_configs_5_0= ruleStyleConfig ) )* otherlv_6= '}' )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1321:1: ( () otherlv_1= 'imageStyle' (otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )? otherlv_4= '{' ( (lv_configs_5_0= ruleStyleConfig ) )* otherlv_6= '}' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1321:2: () otherlv_1= 'imageStyle' (otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )? otherlv_4= '{' ( (lv_configs_5_0= ruleStyleConfig ) )* otherlv_6= '}'
+            // InternalGridSource.g:1313:2: ( () otherlv_1= 'imageStyle' (otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )? otherlv_4= '{' ( (lv_configs_5_0= ruleStyleConfig ) )* otherlv_6= '}' )
+            // InternalGridSource.g:1314:3: () otherlv_1= 'imageStyle' (otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )? otherlv_4= '{' ( (lv_configs_5_0= ruleStyleConfig ) )* otherlv_6= '}'
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1321:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1322:5: 
+            // InternalGridSource.g:1314:3: ()
+            // InternalGridSource.g:1315:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getPropertyImageStyleAccess().getCxGridPropImageStyleAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getPropertyImageStyleAccess().getCxGridPropImageStyleAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,47,FOLLOW_47_in_rulePropertyImageStyle2927); if (state.failed) return current;
+            otherlv_1=(Token)match(input,47,FOLLOW_32); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getPropertyImageStyleAccess().getImageStyleKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getPropertyImageStyleAccess().getImageStyleKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1331:1: (otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )?
+            // InternalGridSource.g:1325:3: (otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) ) )?
             int alt11=2;
             int LA11_0 = input.LA(1);
 
@@ -3513,37 +3553,37 @@
             }
             switch (alt11) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1331:3: otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) )
+                    // InternalGridSource.g:1326:4: otherlv_2= 'eventTopic' ( (lv_eventTopic_3_0= RULE_STRING ) )
                     {
-                    otherlv_2=(Token)match(input,28,FOLLOW_28_in_rulePropertyImageStyle2940); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,28,FOLLOW_19); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_2, grammarAccess.getPropertyImageStyleAccess().getEventTopicKeyword_2_0());
-                          
+                      				newLeafNode(otherlv_2, grammarAccess.getPropertyImageStyleAccess().getEventTopicKeyword_2_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1335:1: ( (lv_eventTopic_3_0= RULE_STRING ) )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1336:1: (lv_eventTopic_3_0= RULE_STRING )
+                    // InternalGridSource.g:1330:4: ( (lv_eventTopic_3_0= RULE_STRING ) )
+                    // InternalGridSource.g:1331:5: (lv_eventTopic_3_0= RULE_STRING )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1336:1: (lv_eventTopic_3_0= RULE_STRING )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1337:3: lv_eventTopic_3_0= RULE_STRING
+                    // InternalGridSource.g:1331:5: (lv_eventTopic_3_0= RULE_STRING )
+                    // InternalGridSource.g:1332:6: lv_eventTopic_3_0= RULE_STRING
                     {
-                    lv_eventTopic_3_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rulePropertyImageStyle2957); if (state.failed) return current;
+                    lv_eventTopic_3_0=(Token)match(input,RULE_STRING,FOLLOW_6); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      			newLeafNode(lv_eventTopic_3_0, grammarAccess.getPropertyImageStyleAccess().getEventTopicSTRINGTerminalRuleCall_2_1_0()); 
-                      		
+                      						newLeafNode(lv_eventTopic_3_0, grammarAccess.getPropertyImageStyleAccess().getEventTopicSTRINGTerminalRuleCall_2_1_0());
+                      					
                     }
                     if ( state.backtracking==0 ) {
 
-                      	        if (current==null) {
-                      	            current = createModelElement(grammarAccess.getPropertyImageStyleRule());
-                      	        }
-                             		setWithLastConsumed(
-                             			current, 
-                             			"eventTopic",
-                              		lv_eventTopic_3_0, 
-                              		"STRING");
-                      	    
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getPropertyImageStyleRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"eventTopic",
+                      							lv_eventTopic_3_0,
+                      							"org.eclipse.xtext.xbase.Xtype.STRING");
+                      					
                     }
 
                     }
@@ -3557,13 +3597,13 @@
 
             }
 
-            otherlv_4=(Token)match(input,15,FOLLOW_15_in_rulePropertyImageStyle2976); if (state.failed) return current;
+            otherlv_4=(Token)match(input,15,FOLLOW_33); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_4, grammarAccess.getPropertyImageStyleAccess().getLeftCurlyBracketKeyword_3());
-                  
+              			newLeafNode(otherlv_4, grammarAccess.getPropertyImageStyleAccess().getLeftCurlyBracketKeyword_3());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1357:1: ( (lv_configs_5_0= ruleStyleConfig ) )*
+            // InternalGridSource.g:1353:3: ( (lv_configs_5_0= ruleStyleConfig ) )*
             loop12:
             do {
                 int alt12=2;
@@ -3576,33 +3616,33 @@
 
                 switch (alt12) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1358:1: (lv_configs_5_0= ruleStyleConfig )
+            	    // InternalGridSource.g:1354:4: (lv_configs_5_0= ruleStyleConfig )
             	    {
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1358:1: (lv_configs_5_0= ruleStyleConfig )
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1359:3: lv_configs_5_0= ruleStyleConfig
+            	    // InternalGridSource.g:1354:4: (lv_configs_5_0= ruleStyleConfig )
+            	    // InternalGridSource.g:1355:5: lv_configs_5_0= ruleStyleConfig
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	      	        newCompositeNode(grammarAccess.getPropertyImageStyleAccess().getConfigsStyleConfigParserRuleCall_4_0()); 
-            	      	    
+
+            	      					newCompositeNode(grammarAccess.getPropertyImageStyleAccess().getConfigsStyleConfigParserRuleCall_4_0());
+            	      				
             	    }
-            	    pushFollow(FOLLOW_ruleStyleConfig_in_rulePropertyImageStyle2997);
+            	    pushFollow(FOLLOW_33);
             	    lv_configs_5_0=ruleStyleConfig();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      	        if (current==null) {
-            	      	            current = createModelElementForParent(grammarAccess.getPropertyImageStyleRule());
-            	      	        }
-            	             		add(
-            	             			current, 
-            	             			"configs",
-            	              		lv_configs_5_0, 
-            	              		"StyleConfig");
-            	      	        afterParserOrEnumRuleCall();
-            	      	    
+            	      					if (current==null) {
+            	      						current = createModelElementForParent(grammarAccess.getPropertyImageStyleRule());
+            	      					}
+            	      					add(
+            	      						current,
+            	      						"configs",
+            	      						lv_configs_5_0,
+            	      						"org.eclipse.osbp.xtext.gridsource.GridSource.StyleConfig");
+            	      					afterParserOrEnumRuleCall();
+            	      				
             	    }
 
             	    }
@@ -3616,11 +3656,11 @@
                 }
             } while (true);
 
-            otherlv_6=(Token)match(input,17,FOLLOW_17_in_rulePropertyImageStyle3010); if (state.failed) return current;
+            otherlv_6=(Token)match(input,17,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_6, grammarAccess.getPropertyImageStyleAccess().getRightCurlyBracketKeyword_5());
-                  
+              			newLeafNode(otherlv_6, grammarAccess.getPropertyImageStyleAccess().getRightCurlyBracketKeyword_5());
+              		
             }
 
             }
@@ -3629,14 +3669,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3645,7 +3687,7 @@
 
 
     // $ANTLR start "entryRuleQualifiedName"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1387:1: entryRuleQualifiedName returns [String current=null] : iv_ruleQualifiedName= ruleQualifiedName EOF ;
+    // InternalGridSource.g:1380:1: entryRuleQualifiedName returns [String current=null] : iv_ruleQualifiedName= ruleQualifiedName EOF ;
     public final String entryRuleQualifiedName() throws RecognitionException {
         String current = null;
 
@@ -3653,13 +3695,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1388:2: (iv_ruleQualifiedName= ruleQualifiedName EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1389:2: iv_ruleQualifiedName= ruleQualifiedName EOF
+            // InternalGridSource.g:1380:53: (iv_ruleQualifiedName= ruleQualifiedName EOF )
+            // InternalGridSource.g:1381:2: iv_ruleQualifiedName= ruleQualifiedName EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getQualifiedNameRule()); 
             }
-            pushFollow(FOLLOW_ruleQualifiedName_in_entryRuleQualifiedName3047);
+            pushFollow(FOLLOW_1);
             iv_ruleQualifiedName=ruleQualifiedName();
 
             state._fsp--;
@@ -3667,16 +3709,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleQualifiedName.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedName3058); 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;
@@ -3685,7 +3727,7 @@
 
 
     // $ANTLR start "ruleQualifiedName"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1396:1: ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) ;
+    // InternalGridSource.g:1387: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();
 
@@ -3695,36 +3737,37 @@
         AntlrDatatypeRuleToken this_ValidID_2 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1399:28: ( (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1400:1: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
+            // InternalGridSource.g:1393:2: ( (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) )
+            // InternalGridSource.g:1394:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1400:1: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1401:5: this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
+            // InternalGridSource.g:1394:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
+            // InternalGridSource.g:1395:3: this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
             {
             if ( state.backtracking==0 ) {
-               
-                      newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); 
-                  
+
+              			newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0());
+              		
             }
-            pushFollow(FOLLOW_ruleValidID_in_ruleQualifiedName3105);
+            pushFollow(FOLLOW_17);
             this_ValidID_0=ruleValidID();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		current.merge(this_ValidID_0);
-                  
+              			current.merge(this_ValidID_0);
+              		
             }
             if ( state.backtracking==0 ) {
-               
-                      afterParserOrEnumRuleCall();
-                  
+
+              			afterParserOrEnumRuleCall();
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1411:1: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
+            // InternalGridSource.g:1405:3: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
             loop13:
             do {
                 int alt13=2;
@@ -3743,40 +3786,40 @@
 
                 switch (alt13) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1411:2: ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID
+            	    // InternalGridSource.g:1406:4: ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID
             	    {
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1411:2: ( ( '.' )=>kw= '.' )
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1411:3: ( '.' )=>kw= '.'
+            	    // InternalGridSource.g:1406:4: ( ( '.' )=>kw= '.' )
+            	    // InternalGridSource.g:1407:5: ( '.' )=>kw= '.'
             	    {
-            	    kw=(Token)match(input,26,FOLLOW_26_in_ruleQualifiedName3133); if (state.failed) return current;
+            	    kw=(Token)match(input,26,FOLLOW_3); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	              current.merge(kw);
-            	              newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); 
-            	          
+            	      					current.merge(kw);
+            	      					newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0());
+            	      				
             	    }
 
             	    }
 
             	    if ( state.backtracking==0 ) {
-            	       
-            	              newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); 
-            	          
+
+            	      				newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1());
+            	      			
             	    }
-            	    pushFollow(FOLLOW_ruleValidID_in_ruleQualifiedName3156);
+            	    pushFollow(FOLLOW_17);
             	    this_ValidID_2=ruleValidID();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      		current.merge(this_ValidID_2);
-            	          
+            	      				current.merge(this_ValidID_2);
+            	      			
             	    }
             	    if ( state.backtracking==0 ) {
-            	       
-            	              afterParserOrEnumRuleCall();
-            	          
+
+            	      				afterParserOrEnumRuleCall();
+            	      			
             	    }
 
             	    }
@@ -3794,14 +3837,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3810,7 +3855,7 @@
 
 
     // $ANTLR start "entryRuleValidID"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1438:1: entryRuleValidID returns [String current=null] : iv_ruleValidID= ruleValidID EOF ;
+    // InternalGridSource.g:1429:1: entryRuleValidID returns [String current=null] : iv_ruleValidID= ruleValidID EOF ;
     public final String entryRuleValidID() throws RecognitionException {
         String current = null;
 
@@ -3818,13 +3863,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1439:2: (iv_ruleValidID= ruleValidID EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1440:2: iv_ruleValidID= ruleValidID EOF
+            // InternalGridSource.g:1429:47: (iv_ruleValidID= ruleValidID EOF )
+            // InternalGridSource.g:1430:2: iv_ruleValidID= ruleValidID EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getValidIDRule()); 
             }
-            pushFollow(FOLLOW_ruleValidID_in_entryRuleValidID3204);
+            pushFollow(FOLLOW_1);
             iv_ruleValidID=ruleValidID();
 
             state._fsp--;
@@ -3832,16 +3877,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleValidID.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleValidID3215); 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;
@@ -3850,41 +3895,44 @@
 
 
     // $ANTLR start "ruleValidID"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1447:1: ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
+    // InternalGridSource.g:1436: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(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1450:28: (this_ID_0= RULE_ID )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1451:5: this_ID_0= RULE_ID
+            // InternalGridSource.g:1442:2: (this_ID_0= RULE_ID )
+            // InternalGridSource.g:1443:2: this_ID_0= RULE_ID
             {
-            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleValidID3254); if (state.failed) return current;
+            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()); 
-                  
+
+              		newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall());
+              	
             }
 
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -3893,7 +3941,7 @@
 
 
     // $ANTLR start "entryRuleStyleConfig"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1466:1: entryRuleStyleConfig returns [EObject current=null] : iv_ruleStyleConfig= ruleStyleConfig EOF ;
+    // InternalGridSource.g:1453:1: entryRuleStyleConfig returns [EObject current=null] : iv_ruleStyleConfig= ruleStyleConfig EOF ;
     public final EObject entryRuleStyleConfig() throws RecognitionException {
         EObject current = null;
 
@@ -3901,13 +3949,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1467:2: (iv_ruleStyleConfig= ruleStyleConfig EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1468:2: iv_ruleStyleConfig= ruleStyleConfig EOF
+            // InternalGridSource.g:1453:52: (iv_ruleStyleConfig= ruleStyleConfig EOF )
+            // InternalGridSource.g:1454:2: iv_ruleStyleConfig= ruleStyleConfig EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getStyleConfigRule()); 
             }
-            pushFollow(FOLLOW_ruleStyleConfig_in_entryRuleStyleConfig3298);
+            pushFollow(FOLLOW_1);
             iv_ruleStyleConfig=ruleStyleConfig();
 
             state._fsp--;
@@ -3915,16 +3963,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleStyleConfig; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleStyleConfig3308); 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;
@@ -3933,7 +3981,7 @@
 
 
     // $ANTLR start "ruleStyleConfig"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1475:1: ruleStyleConfig returns [EObject current=null] : (this_NumericToResourceStyleConfig_0= ruleNumericToResourceStyleConfig | this_StringToResourceStyleConfig_1= ruleStringToResourceStyleConfig ) ;
+    // InternalGridSource.g:1460:1: ruleStyleConfig returns [EObject current=null] : (this_NumericToResourceStyleConfig_0= ruleNumericToResourceStyleConfig | this_StringToResourceStyleConfig_1= ruleStringToResourceStyleConfig ) ;
     public final EObject ruleStyleConfig() throws RecognitionException {
         EObject current = null;
 
@@ -3942,13 +3990,14 @@
         EObject this_StringToResourceStyleConfig_1 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1478:28: ( (this_NumericToResourceStyleConfig_0= ruleNumericToResourceStyleConfig | this_StringToResourceStyleConfig_1= ruleStringToResourceStyleConfig ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1479:1: (this_NumericToResourceStyleConfig_0= ruleNumericToResourceStyleConfig | this_StringToResourceStyleConfig_1= ruleStringToResourceStyleConfig )
+            // InternalGridSource.g:1466:2: ( (this_NumericToResourceStyleConfig_0= ruleNumericToResourceStyleConfig | this_StringToResourceStyleConfig_1= ruleStringToResourceStyleConfig ) )
+            // InternalGridSource.g:1467:2: (this_NumericToResourceStyleConfig_0= ruleNumericToResourceStyleConfig | this_StringToResourceStyleConfig_1= ruleStringToResourceStyleConfig )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1479:1: (this_NumericToResourceStyleConfig_0= ruleNumericToResourceStyleConfig | this_StringToResourceStyleConfig_1= ruleStringToResourceStyleConfig )
+            // InternalGridSource.g:1467:2: (this_NumericToResourceStyleConfig_0= ruleNumericToResourceStyleConfig | this_StringToResourceStyleConfig_1= ruleStringToResourceStyleConfig )
             int alt14=2;
             int LA14_0 = input.LA(1);
 
@@ -3967,45 +4016,45 @@
             }
             switch (alt14) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1480:5: this_NumericToResourceStyleConfig_0= ruleNumericToResourceStyleConfig
+                    // InternalGridSource.g:1468:3: this_NumericToResourceStyleConfig_0= ruleNumericToResourceStyleConfig
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getStyleConfigAccess().getNumericToResourceStyleConfigParserRuleCall_0()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getStyleConfigAccess().getNumericToResourceStyleConfigParserRuleCall_0());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleNumericToResourceStyleConfig_in_ruleStyleConfig3355);
+                    pushFollow(FOLLOW_2);
                     this_NumericToResourceStyleConfig_0=ruleNumericToResourceStyleConfig();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_NumericToResourceStyleConfig_0; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_NumericToResourceStyleConfig_0;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1490:5: this_StringToResourceStyleConfig_1= ruleStringToResourceStyleConfig
+                    // InternalGridSource.g:1477:3: this_StringToResourceStyleConfig_1= ruleStringToResourceStyleConfig
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getStyleConfigAccess().getStringToResourceStyleConfigParserRuleCall_1()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getStyleConfigAccess().getStringToResourceStyleConfigParserRuleCall_1());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleStringToResourceStyleConfig_in_ruleStyleConfig3382);
+                    pushFollow(FOLLOW_2);
                     this_StringToResourceStyleConfig_1=ruleStringToResourceStyleConfig();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_StringToResourceStyleConfig_1; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_StringToResourceStyleConfig_1;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
@@ -4017,14 +4066,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4033,7 +4084,7 @@
 
 
     // $ANTLR start "entryRuleNumericToResourceStyleConfig"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1506:1: entryRuleNumericToResourceStyleConfig returns [EObject current=null] : iv_ruleNumericToResourceStyleConfig= ruleNumericToResourceStyleConfig EOF ;
+    // InternalGridSource.g:1489:1: entryRuleNumericToResourceStyleConfig returns [EObject current=null] : iv_ruleNumericToResourceStyleConfig= ruleNumericToResourceStyleConfig EOF ;
     public final EObject entryRuleNumericToResourceStyleConfig() throws RecognitionException {
         EObject current = null;
 
@@ -4041,13 +4092,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1507:2: (iv_ruleNumericToResourceStyleConfig= ruleNumericToResourceStyleConfig EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1508:2: iv_ruleNumericToResourceStyleConfig= ruleNumericToResourceStyleConfig EOF
+            // InternalGridSource.g:1489:69: (iv_ruleNumericToResourceStyleConfig= ruleNumericToResourceStyleConfig EOF )
+            // InternalGridSource.g:1490:2: iv_ruleNumericToResourceStyleConfig= ruleNumericToResourceStyleConfig EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getNumericToResourceStyleConfigRule()); 
             }
-            pushFollow(FOLLOW_ruleNumericToResourceStyleConfig_in_entryRuleNumericToResourceStyleConfig3417);
+            pushFollow(FOLLOW_1);
             iv_ruleNumericToResourceStyleConfig=ruleNumericToResourceStyleConfig();
 
             state._fsp--;
@@ -4055,16 +4106,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleNumericToResourceStyleConfig; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleNumericToResourceStyleConfig3427); 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;
@@ -4073,7 +4124,7 @@
 
 
     // $ANTLR start "ruleNumericToResourceStyleConfig"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1515:1: ruleNumericToResourceStyleConfig returns [EObject current=null] : (otherlv_0= 'number' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= ruleLDouble ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) ) ;
+    // InternalGridSource.g:1496:1: ruleNumericToResourceStyleConfig returns [EObject current=null] : (otherlv_0= 'number' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= ruleLDouble ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) ) ;
     public final EObject ruleNumericToResourceStyleConfig() throws RecognitionException {
         EObject current = null;
 
@@ -4085,49 +4136,50 @@
         AntlrDatatypeRuleToken lv_value_2_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1518:28: ( (otherlv_0= 'number' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= ruleLDouble ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1519:1: (otherlv_0= 'number' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= ruleLDouble ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) )
+            // InternalGridSource.g:1502:2: ( (otherlv_0= 'number' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= ruleLDouble ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) ) )
+            // InternalGridSource.g:1503:2: (otherlv_0= 'number' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= ruleLDouble ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1519:1: (otherlv_0= 'number' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= ruleLDouble ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1519:3: otherlv_0= 'number' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= ruleLDouble ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) )
+            // InternalGridSource.g:1503:2: (otherlv_0= 'number' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= ruleLDouble ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) )
+            // InternalGridSource.g:1504:3: otherlv_0= 'number' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= ruleLDouble ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) )
             {
-            otherlv_0=(Token)match(input,48,FOLLOW_48_in_ruleNumericToResourceStyleConfig3464); if (state.failed) return current;
+            otherlv_0=(Token)match(input,48,FOLLOW_34); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getNumericToResourceStyleConfigAccess().getNumberKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getNumericToResourceStyleConfigAccess().getNumberKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1523:1: ( (lv_compare_1_0= ruleStyleCompare ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1524:1: (lv_compare_1_0= ruleStyleCompare )
+            // InternalGridSource.g:1508:3: ( (lv_compare_1_0= ruleStyleCompare ) )
+            // InternalGridSource.g:1509:4: (lv_compare_1_0= ruleStyleCompare )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1524:1: (lv_compare_1_0= ruleStyleCompare )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1525:3: lv_compare_1_0= ruleStyleCompare
+            // InternalGridSource.g:1509:4: (lv_compare_1_0= ruleStyleCompare )
+            // InternalGridSource.g:1510:5: lv_compare_1_0= ruleStyleCompare
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0());
+              				
             }
-            pushFollow(FOLLOW_ruleStyleCompare_in_ruleNumericToResourceStyleConfig3485);
+            pushFollow(FOLLOW_22);
             lv_compare_1_0=ruleStyleCompare();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getNumericToResourceStyleConfigRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"compare",
-                      		lv_compare_1_0, 
-                      		"StyleCompare");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getNumericToResourceStyleConfigRule());
+              					}
+              					set(
+              						current,
+              						"compare",
+              						lv_compare_1_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.StyleCompare");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -4135,34 +4187,34 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1541:2: ( (lv_value_2_0= ruleLDouble ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1542:1: (lv_value_2_0= ruleLDouble )
+            // InternalGridSource.g:1527:3: ( (lv_value_2_0= ruleLDouble ) )
+            // InternalGridSource.g:1528:4: (lv_value_2_0= ruleLDouble )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1542:1: (lv_value_2_0= ruleLDouble )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1543:3: lv_value_2_0= ruleLDouble
+            // InternalGridSource.g:1528:4: (lv_value_2_0= ruleLDouble )
+            // InternalGridSource.g:1529:5: lv_value_2_0= ruleLDouble
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getNumericToResourceStyleConfigAccess().getValueLDoubleParserRuleCall_2_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getNumericToResourceStyleConfigAccess().getValueLDoubleParserRuleCall_2_0());
+              				
             }
-            pushFollow(FOLLOW_ruleLDouble_in_ruleNumericToResourceStyleConfig3506);
+            pushFollow(FOLLOW_35);
             lv_value_2_0=ruleLDouble();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getNumericToResourceStyleConfigRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"value",
-                      		lv_value_2_0, 
-                      		"LDouble");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getNumericToResourceStyleConfigRule());
+              					}
+              					set(
+              						current,
+              						"value",
+              						lv_value_2_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.LDouble");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -4170,35 +4222,35 @@
 
             }
 
-            otherlv_3=(Token)match(input,49,FOLLOW_49_in_ruleNumericToResourceStyleConfig3518); if (state.failed) return current;
+            otherlv_3=(Token)match(input,49,FOLLOW_36); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_3, grammarAccess.getNumericToResourceStyleConfigAccess().getThenKeyword_3());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1563:1: ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1564:1: (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE )
-            {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1564:1: (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1565:3: lv_resourceThemePath_4_0= RULE_THEME_RESOURCE
-            {
-            lv_resourceThemePath_4_0=(Token)match(input,RULE_THEME_RESOURCE,FOLLOW_RULE_THEME_RESOURCE_in_ruleNumericToResourceStyleConfig3535); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-              			newLeafNode(lv_resourceThemePath_4_0, grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0()); 
+              			newLeafNode(otherlv_3, grammarAccess.getNumericToResourceStyleConfigAccess().getThenKeyword_3());
               		
             }
+            // InternalGridSource.g:1550:3: ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) )
+            // InternalGridSource.g:1551:4: (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE )
+            {
+            // InternalGridSource.g:1551:4: (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE )
+            // InternalGridSource.g:1552:5: lv_resourceThemePath_4_0= RULE_THEME_RESOURCE
+            {
+            lv_resourceThemePath_4_0=(Token)match(input,RULE_THEME_RESOURCE,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getNumericToResourceStyleConfigRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"resourceThemePath",
-                      		lv_resourceThemePath_4_0, 
-                      		"THEME_RESOURCE");
-              	    
+              					newLeafNode(lv_resourceThemePath_4_0, grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getNumericToResourceStyleConfigRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"resourceThemePath",
+              						lv_resourceThemePath_4_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.THEME_RESOURCE");
+              				
             }
 
             }
@@ -4213,14 +4265,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4229,7 +4283,7 @@
 
 
     // $ANTLR start "entryRuleStringToResourceStyleConfig"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1589:1: entryRuleStringToResourceStyleConfig returns [EObject current=null] : iv_ruleStringToResourceStyleConfig= ruleStringToResourceStyleConfig EOF ;
+    // InternalGridSource.g:1572:1: entryRuleStringToResourceStyleConfig returns [EObject current=null] : iv_ruleStringToResourceStyleConfig= ruleStringToResourceStyleConfig EOF ;
     public final EObject entryRuleStringToResourceStyleConfig() throws RecognitionException {
         EObject current = null;
 
@@ -4237,13 +4291,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1590:2: (iv_ruleStringToResourceStyleConfig= ruleStringToResourceStyleConfig EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1591:2: iv_ruleStringToResourceStyleConfig= ruleStringToResourceStyleConfig EOF
+            // InternalGridSource.g:1572:68: (iv_ruleStringToResourceStyleConfig= ruleStringToResourceStyleConfig EOF )
+            // InternalGridSource.g:1573:2: iv_ruleStringToResourceStyleConfig= ruleStringToResourceStyleConfig EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getStringToResourceStyleConfigRule()); 
             }
-            pushFollow(FOLLOW_ruleStringToResourceStyleConfig_in_entryRuleStringToResourceStyleConfig3576);
+            pushFollow(FOLLOW_1);
             iv_ruleStringToResourceStyleConfig=ruleStringToResourceStyleConfig();
 
             state._fsp--;
@@ -4251,16 +4305,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleStringToResourceStyleConfig; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleStringToResourceStyleConfig3586); 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;
@@ -4269,7 +4323,7 @@
 
 
     // $ANTLR start "ruleStringToResourceStyleConfig"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1598:1: ruleStringToResourceStyleConfig returns [EObject current=null] : (otherlv_0= 'string' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= RULE_STRING ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) ) ;
+    // InternalGridSource.g:1579:1: ruleStringToResourceStyleConfig returns [EObject current=null] : (otherlv_0= 'string' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= RULE_STRING ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) ) ;
     public final EObject ruleStringToResourceStyleConfig() throws RecognitionException {
         EObject current = null;
 
@@ -4280,49 +4334,50 @@
         Enumerator lv_compare_1_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1601:28: ( (otherlv_0= 'string' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= RULE_STRING ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1602:1: (otherlv_0= 'string' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= RULE_STRING ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) )
+            // InternalGridSource.g:1585:2: ( (otherlv_0= 'string' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= RULE_STRING ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) ) )
+            // InternalGridSource.g:1586:2: (otherlv_0= 'string' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= RULE_STRING ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1602:1: (otherlv_0= 'string' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= RULE_STRING ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1602:3: otherlv_0= 'string' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= RULE_STRING ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) )
+            // InternalGridSource.g:1586:2: (otherlv_0= 'string' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= RULE_STRING ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) ) )
+            // InternalGridSource.g:1587:3: otherlv_0= 'string' ( (lv_compare_1_0= ruleStyleCompare ) ) ( (lv_value_2_0= RULE_STRING ) ) otherlv_3= 'then' ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) )
             {
-            otherlv_0=(Token)match(input,50,FOLLOW_50_in_ruleStringToResourceStyleConfig3623); if (state.failed) return current;
+            otherlv_0=(Token)match(input,50,FOLLOW_34); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getStringToResourceStyleConfigAccess().getStringKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getStringToResourceStyleConfigAccess().getStringKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1606:1: ( (lv_compare_1_0= ruleStyleCompare ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1607:1: (lv_compare_1_0= ruleStyleCompare )
+            // InternalGridSource.g:1591:3: ( (lv_compare_1_0= ruleStyleCompare ) )
+            // InternalGridSource.g:1592:4: (lv_compare_1_0= ruleStyleCompare )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1607:1: (lv_compare_1_0= ruleStyleCompare )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1608:3: lv_compare_1_0= ruleStyleCompare
+            // InternalGridSource.g:1592:4: (lv_compare_1_0= ruleStyleCompare )
+            // InternalGridSource.g:1593:5: lv_compare_1_0= ruleStyleCompare
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getStringToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getStringToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0());
+              				
             }
-            pushFollow(FOLLOW_ruleStyleCompare_in_ruleStringToResourceStyleConfig3644);
+            pushFollow(FOLLOW_19);
             lv_compare_1_0=ruleStyleCompare();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElementForParent(grammarAccess.getStringToResourceStyleConfigRule());
-              	        }
-                     		set(
-                     			current, 
-                     			"compare",
-                      		lv_compare_1_0, 
-                      		"StyleCompare");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getStringToResourceStyleConfigRule());
+              					}
+              					set(
+              						current,
+              						"compare",
+              						lv_compare_1_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.StyleCompare");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -4330,65 +4385,65 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1624:2: ( (lv_value_2_0= RULE_STRING ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1625:1: (lv_value_2_0= RULE_STRING )
+            // InternalGridSource.g:1610:3: ( (lv_value_2_0= RULE_STRING ) )
+            // InternalGridSource.g:1611:4: (lv_value_2_0= RULE_STRING )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1625:1: (lv_value_2_0= RULE_STRING )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1626:3: lv_value_2_0= RULE_STRING
+            // InternalGridSource.g:1611:4: (lv_value_2_0= RULE_STRING )
+            // InternalGridSource.g:1612:5: lv_value_2_0= RULE_STRING
             {
-            lv_value_2_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleStringToResourceStyleConfig3661); if (state.failed) return current;
+            lv_value_2_0=(Token)match(input,RULE_STRING,FOLLOW_35); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              			newLeafNode(lv_value_2_0, grammarAccess.getStringToResourceStyleConfigAccess().getValueSTRINGTerminalRuleCall_2_0()); 
+              					newLeafNode(lv_value_2_0, grammarAccess.getStringToResourceStyleConfigAccess().getValueSTRINGTerminalRuleCall_2_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getStringToResourceStyleConfigRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"value",
+              						lv_value_2_0,
+              						"org.eclipse.xtext.xbase.Xtype.STRING");
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,49,FOLLOW_36); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getStringToResourceStyleConfigAccess().getThenKeyword_3());
               		
             }
-            if ( state.backtracking==0 ) {
-
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getStringToResourceStyleConfigRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"value",
-                      		lv_value_2_0, 
-                      		"STRING");
-              	    
-            }
-
-            }
-
-
-            }
-
-            otherlv_3=(Token)match(input,49,FOLLOW_49_in_ruleStringToResourceStyleConfig3678); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
-
-                  	newLeafNode(otherlv_3, grammarAccess.getStringToResourceStyleConfigAccess().getThenKeyword_3());
-                  
-            }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1646:1: ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1647:1: (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE )
+            // InternalGridSource.g:1632:3: ( (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE ) )
+            // InternalGridSource.g:1633:4: (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1647:1: (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1648:3: lv_resourceThemePath_4_0= RULE_THEME_RESOURCE
+            // InternalGridSource.g:1633:4: (lv_resourceThemePath_4_0= RULE_THEME_RESOURCE )
+            // InternalGridSource.g:1634:5: lv_resourceThemePath_4_0= RULE_THEME_RESOURCE
             {
-            lv_resourceThemePath_4_0=(Token)match(input,RULE_THEME_RESOURCE,FOLLOW_RULE_THEME_RESOURCE_in_ruleStringToResourceStyleConfig3695); if (state.failed) return current;
+            lv_resourceThemePath_4_0=(Token)match(input,RULE_THEME_RESOURCE,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              			newLeafNode(lv_resourceThemePath_4_0, grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0()); 
-              		
+              					newLeafNode(lv_resourceThemePath_4_0, grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0());
+              				
             }
             if ( state.backtracking==0 ) {
 
-              	        if (current==null) {
-              	            current = createModelElement(grammarAccess.getStringToResourceStyleConfigRule());
-              	        }
-                     		setWithLastConsumed(
-                     			current, 
-                     			"resourceThemePath",
-                      		lv_resourceThemePath_4_0, 
-                      		"THEME_RESOURCE");
-              	    
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getStringToResourceStyleConfigRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"resourceThemePath",
+              						lv_resourceThemePath_4_0,
+              						"org.eclipse.osbp.xtext.gridsource.GridSource.THEME_RESOURCE");
+              				
             }
 
             }
@@ -4403,14 +4458,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4419,7 +4476,7 @@
 
 
     // $ANTLR start "entryRuleLInt"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1672:1: entryRuleLInt returns [String current=null] : iv_ruleLInt= ruleLInt EOF ;
+    // InternalGridSource.g:1654:1: entryRuleLInt returns [String current=null] : iv_ruleLInt= ruleLInt EOF ;
     public final String entryRuleLInt() throws RecognitionException {
         String current = null;
 
@@ -4427,13 +4484,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1673:2: (iv_ruleLInt= ruleLInt EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1674:2: iv_ruleLInt= ruleLInt EOF
+            // InternalGridSource.g:1654:44: (iv_ruleLInt= ruleLInt EOF )
+            // InternalGridSource.g:1655:2: iv_ruleLInt= ruleLInt EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getLIntRule()); 
             }
-            pushFollow(FOLLOW_ruleLInt_in_entryRuleLInt3737);
+            pushFollow(FOLLOW_1);
             iv_ruleLInt=ruleLInt();
 
             state._fsp--;
@@ -4441,16 +4498,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleLInt.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleLInt3748); 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;
@@ -4459,23 +4516,24 @@
 
 
     // $ANTLR start "ruleLInt"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1681:1: ruleLInt returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT ) ;
+    // InternalGridSource.g:1661:1: ruleLInt returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT ) ;
     public final AntlrDatatypeRuleToken ruleLInt() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
         Token kw=null;
         Token this_INT_2=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1684:28: ( ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1685:1: ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT )
+            // InternalGridSource.g:1667:2: ( ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT ) )
+            // InternalGridSource.g:1668:2: ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1685:1: ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1685:2: (kw= '+' | kw= '-' )? this_INT_2= RULE_INT
+            // InternalGridSource.g:1668:2: ( (kw= '+' | kw= '-' )? this_INT_2= RULE_INT )
+            // InternalGridSource.g:1669:3: (kw= '+' | kw= '-' )? this_INT_2= RULE_INT
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1685:2: (kw= '+' | kw= '-' )?
+            // InternalGridSource.g:1669:3: (kw= '+' | kw= '-' )?
             int alt15=3;
             int LA15_0 = input.LA(1);
 
@@ -4487,27 +4545,27 @@
             }
             switch (alt15) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1686:2: kw= '+'
+                    // InternalGridSource.g:1670:4: kw= '+'
                     {
-                    kw=(Token)match(input,51,FOLLOW_51_in_ruleLInt3787); if (state.failed) return current;
+                    kw=(Token)match(input,51,FOLLOW_37); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getLIntAccess().getPlusSignKeyword_0_0()); 
-                          
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getLIntAccess().getPlusSignKeyword_0_0());
+                      			
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1693:2: kw= '-'
+                    // InternalGridSource.g:1676:4: kw= '-'
                     {
-                    kw=(Token)match(input,52,FOLLOW_52_in_ruleLInt3806); if (state.failed) return current;
+                    kw=(Token)match(input,52,FOLLOW_37); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getLIntAccess().getHyphenMinusKeyword_0_1()); 
-                          
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getLIntAccess().getHyphenMinusKeyword_0_1());
+                      			
                     }
 
                     }
@@ -4515,16 +4573,16 @@
 
             }
 
-            this_INT_2=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleLInt3823); if (state.failed) return current;
+            this_INT_2=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		current.merge(this_INT_2);
-                  
+              			current.merge(this_INT_2);
+              		
             }
             if ( state.backtracking==0 ) {
-               
-                  newLeafNode(this_INT_2, grammarAccess.getLIntAccess().getINTTerminalRuleCall_1()); 
-                  
+
+              			newLeafNode(this_INT_2, grammarAccess.getLIntAccess().getINTTerminalRuleCall_1());
+              		
             }
 
             }
@@ -4533,14 +4591,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4549,7 +4609,7 @@
 
 
     // $ANTLR start "entryRuleLDouble"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1713:1: entryRuleLDouble returns [String current=null] : iv_ruleLDouble= ruleLDouble EOF ;
+    // InternalGridSource.g:1693:1: entryRuleLDouble returns [String current=null] : iv_ruleLDouble= ruleLDouble EOF ;
     public final String entryRuleLDouble() throws RecognitionException {
         String current = null;
 
@@ -4557,13 +4617,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1714:2: (iv_ruleLDouble= ruleLDouble EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1715:2: iv_ruleLDouble= ruleLDouble EOF
+            // InternalGridSource.g:1693:47: (iv_ruleLDouble= ruleLDouble EOF )
+            // InternalGridSource.g:1694:2: iv_ruleLDouble= ruleLDouble EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getLDoubleRule()); 
             }
-            pushFollow(FOLLOW_ruleLDouble_in_entryRuleLDouble3869);
+            pushFollow(FOLLOW_1);
             iv_ruleLDouble=ruleLDouble();
 
             state._fsp--;
@@ -4571,16 +4631,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleLDouble.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleLDouble3880); 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;
@@ -4589,7 +4649,7 @@
 
 
     // $ANTLR start "ruleLDouble"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1722:1: ruleLDouble returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? ) ;
+    // InternalGridSource.g:1700:1: ruleLDouble returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? ) ;
     public final AntlrDatatypeRuleToken ruleLDouble() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -4598,36 +4658,37 @@
         AntlrDatatypeRuleToken this_LInt_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1725:28: ( (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1726:1: (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? )
+            // InternalGridSource.g:1706:2: ( (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? ) )
+            // InternalGridSource.g:1707:2: (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1726:1: (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1727:5: this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )?
+            // InternalGridSource.g:1707:2: (this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )? )
+            // InternalGridSource.g:1708:3: this_LInt_0= ruleLInt (kw= '.' this_INT_2= RULE_INT )?
             {
             if ( state.backtracking==0 ) {
-               
-                      newCompositeNode(grammarAccess.getLDoubleAccess().getLIntParserRuleCall_0()); 
-                  
+
+              			newCompositeNode(grammarAccess.getLDoubleAccess().getLIntParserRuleCall_0());
+              		
             }
-            pushFollow(FOLLOW_ruleLInt_in_ruleLDouble3927);
+            pushFollow(FOLLOW_17);
             this_LInt_0=ruleLInt();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		current.merge(this_LInt_0);
-                  
+              			current.merge(this_LInt_0);
+              		
             }
             if ( state.backtracking==0 ) {
-               
-                      afterParserOrEnumRuleCall();
-                  
+
+              			afterParserOrEnumRuleCall();
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1737:1: (kw= '.' this_INT_2= RULE_INT )?
+            // InternalGridSource.g:1718:3: (kw= '.' this_INT_2= RULE_INT )?
             int alt16=2;
             int LA16_0 = input.LA(1);
 
@@ -4636,25 +4697,25 @@
             }
             switch (alt16) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1738:2: kw= '.' this_INT_2= RULE_INT
+                    // InternalGridSource.g:1719:4: kw= '.' this_INT_2= RULE_INT
                     {
-                    kw=(Token)match(input,26,FOLLOW_26_in_ruleLDouble3946); if (state.failed) return current;
+                    kw=(Token)match(input,26,FOLLOW_37); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current.merge(kw);
-                              newLeafNode(kw, grammarAccess.getLDoubleAccess().getFullStopKeyword_1_0()); 
-                          
+                      				current.merge(kw);
+                      				newLeafNode(kw, grammarAccess.getLDoubleAccess().getFullStopKeyword_1_0());
+                      			
                     }
-                    this_INT_2=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleLDouble3961); if (state.failed) return current;
+                    this_INT_2=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      		current.merge(this_INT_2);
-                          
+                      				current.merge(this_INT_2);
+                      			
                     }
                     if ( state.backtracking==0 ) {
-                       
-                          newLeafNode(this_INT_2, grammarAccess.getLDoubleAccess().getINTTerminalRuleCall_1_1()); 
-                          
+
+                      				newLeafNode(this_INT_2, grammarAccess.getLDoubleAccess().getINTTerminalRuleCall_1_1());
+                      			
                     }
 
                     }
@@ -4669,14 +4730,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4685,7 +4748,7 @@
 
 
     // $ANTLR start "entryRuleJvmTypeReference"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1758:1: entryRuleJvmTypeReference returns [EObject current=null] : iv_ruleJvmTypeReference= ruleJvmTypeReference EOF ;
+    // InternalGridSource.g:1736:1: entryRuleJvmTypeReference returns [EObject current=null] : iv_ruleJvmTypeReference= ruleJvmTypeReference EOF ;
     public final EObject entryRuleJvmTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -4693,13 +4756,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1759:2: (iv_ruleJvmTypeReference= ruleJvmTypeReference EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1760:2: iv_ruleJvmTypeReference= ruleJvmTypeReference EOF
+            // InternalGridSource.g:1736:57: (iv_ruleJvmTypeReference= ruleJvmTypeReference EOF )
+            // InternalGridSource.g:1737:2: iv_ruleJvmTypeReference= ruleJvmTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmTypeReferenceRule()); 
             }
-            pushFollow(FOLLOW_ruleJvmTypeReference_in_entryRuleJvmTypeReference4008);
+            pushFollow(FOLLOW_1);
             iv_ruleJvmTypeReference=ruleJvmTypeReference();
 
             state._fsp--;
@@ -4707,16 +4770,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleJvmTypeReference; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmTypeReference4018); 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;
@@ -4725,7 +4788,7 @@
 
 
     // $ANTLR start "ruleJvmTypeReference"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1767:1: ruleJvmTypeReference returns [EObject current=null] : ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) ;
+    // InternalGridSource.g:1743: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;
 
@@ -4734,13 +4797,14 @@
         EObject this_XFunctionTypeRef_3 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1770:28: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1771:1: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
+            // InternalGridSource.g:1749:2: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
+            // InternalGridSource.g:1750:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1771:1: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
+            // InternalGridSource.g:1750:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
             int alt18=2;
             int LA18_0 = input.LA(1);
 
@@ -4759,28 +4823,28 @@
             }
             switch (alt18) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1771:2: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
+                    // InternalGridSource.g:1751:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1771:2: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1772:5: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
+                    // InternalGridSource.g:1751:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
+                    // InternalGridSource.g:1752:4: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0()); 
-                          
+
+                      				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
+                      			
                     }
-                    pushFollow(FOLLOW_ruleJvmParameterizedTypeReference_in_ruleJvmTypeReference4066);
+                    pushFollow(FOLLOW_38);
                     this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_JvmParameterizedTypeReference_0; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      				current = this_JvmParameterizedTypeReference_0;
+                      				afterParserOrEnumRuleCall();
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1780:1: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
+                    // InternalGridSource.g:1760:4: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                     loop17:
                     do {
                         int alt17=2;
@@ -4793,38 +4857,38 @@
 
                         switch (alt17) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1780:2: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
+                    	    // InternalGridSource.g:1761:5: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1781:24: ( () ruleArrayBrackets )
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1781:25: () ruleArrayBrackets
+                    	    // InternalGridSource.g:1767:5: ( () ruleArrayBrackets )
+                    	    // InternalGridSource.g:1768:6: () ruleArrayBrackets
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1781:25: ()
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1782:5: 
+                    	    // InternalGridSource.g:1768:6: ()
+                    	    // InternalGridSource.g:1769:7: 
                     	    {
                     	    if ( state.backtracking==0 ) {
 
-                    	              current = forceCreateModelElementAndSet(
-                    	                  grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0(),
-                    	                  current);
-                    	          
+                    	      							current = forceCreateModelElementAndSet(
+                    	      								grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0(),
+                    	      								current);
+                    	      						
                     	    }
 
                     	    }
 
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	              newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1()); 
-                    	          
+
+                    	      						newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1());
+                    	      					
                     	    }
-                    	    pushFollow(FOLLOW_ruleArrayBrackets_in_ruleJvmTypeReference4102);
+                    	    pushFollow(FOLLOW_38);
                     	    ruleArrayBrackets();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	              afterParserOrEnumRuleCall();
-                    	          
+
+                    	      						afterParserOrEnumRuleCall();
+                    	      					
                     	    }
 
                     	    }
@@ -4845,23 +4909,23 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1797:5: this_XFunctionTypeRef_3= ruleXFunctionTypeRef
+                    // InternalGridSource.g:1786:3: this_XFunctionTypeRef_3= ruleXFunctionTypeRef
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleXFunctionTypeRef_in_ruleJvmTypeReference4133);
+                    pushFollow(FOLLOW_2);
                     this_XFunctionTypeRef_3=ruleXFunctionTypeRef();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_XFunctionTypeRef_3; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_XFunctionTypeRef_3;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
@@ -4873,14 +4937,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4889,7 +4955,7 @@
 
 
     // $ANTLR start "entryRuleArrayBrackets"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1813:1: entryRuleArrayBrackets returns [String current=null] : iv_ruleArrayBrackets= ruleArrayBrackets EOF ;
+    // InternalGridSource.g:1798:1: entryRuleArrayBrackets returns [String current=null] : iv_ruleArrayBrackets= ruleArrayBrackets EOF ;
     public final String entryRuleArrayBrackets() throws RecognitionException {
         String current = null;
 
@@ -4897,13 +4963,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1814:2: (iv_ruleArrayBrackets= ruleArrayBrackets EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1815:2: iv_ruleArrayBrackets= ruleArrayBrackets EOF
+            // InternalGridSource.g:1798:53: (iv_ruleArrayBrackets= ruleArrayBrackets EOF )
+            // InternalGridSource.g:1799:2: iv_ruleArrayBrackets= ruleArrayBrackets EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getArrayBracketsRule()); 
             }
-            pushFollow(FOLLOW_ruleArrayBrackets_in_entryRuleArrayBrackets4169);
+            pushFollow(FOLLOW_1);
             iv_ruleArrayBrackets=ruleArrayBrackets();
 
             state._fsp--;
@@ -4911,16 +4977,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleArrayBrackets.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleArrayBrackets4180); 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;
@@ -4929,34 +4995,35 @@
 
 
     // $ANTLR start "ruleArrayBrackets"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1822:1: ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '[' kw= ']' ) ;
+    // InternalGridSource.g:1805:1: ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '[' kw= ']' ) ;
     public final AntlrDatatypeRuleToken ruleArrayBrackets() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
         Token kw=null;
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1825:28: ( (kw= '[' kw= ']' ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1826:1: (kw= '[' kw= ']' )
+            // InternalGridSource.g:1811:2: ( (kw= '[' kw= ']' ) )
+            // InternalGridSource.g:1812:2: (kw= '[' kw= ']' )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1826:1: (kw= '[' kw= ']' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1827:2: kw= '[' kw= ']'
+            // InternalGridSource.g:1812:2: (kw= '[' kw= ']' )
+            // InternalGridSource.g:1813:3: kw= '[' kw= ']'
             {
-            kw=(Token)match(input,53,FOLLOW_53_in_ruleArrayBrackets4218); if (state.failed) return current;
+            kw=(Token)match(input,53,FOLLOW_39); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                      current.merge(kw);
-                      newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0()); 
-                  
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0());
+              		
             }
-            kw=(Token)match(input,54,FOLLOW_54_in_ruleArrayBrackets4231); 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.getArrayBracketsAccess().getRightSquareBracketKeyword_1()); 
-                  
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1());
+              		
             }
 
             }
@@ -4965,14 +5032,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -4981,7 +5050,7 @@
 
 
     // $ANTLR start "entryRuleXFunctionTypeRef"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1846:1: entryRuleXFunctionTypeRef returns [EObject current=null] : iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF ;
+    // InternalGridSource.g:1827:1: entryRuleXFunctionTypeRef returns [EObject current=null] : iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF ;
     public final EObject entryRuleXFunctionTypeRef() throws RecognitionException {
         EObject current = null;
 
@@ -4989,13 +5058,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1847:2: (iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1848:2: iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF
+            // InternalGridSource.g:1827:57: (iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF )
+            // InternalGridSource.g:1828:2: iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXFunctionTypeRefRule()); 
             }
-            pushFollow(FOLLOW_ruleXFunctionTypeRef_in_entryRuleXFunctionTypeRef4271);
+            pushFollow(FOLLOW_1);
             iv_ruleXFunctionTypeRef=ruleXFunctionTypeRef();
 
             state._fsp--;
@@ -5003,16 +5072,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXFunctionTypeRef; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXFunctionTypeRef4281); 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;
@@ -5021,7 +5090,7 @@
 
 
     // $ANTLR start "ruleXFunctionTypeRef"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1855: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 ) ) ) ;
+    // InternalGridSource.g:1834: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;
 
@@ -5036,16 +5105,17 @@
         EObject lv_returnType_6_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1858:28: ( ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1859:1: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
+            // InternalGridSource.g:1840:2: ( ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
+            // InternalGridSource.g:1841:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1859:1: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1859:2: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
+            // InternalGridSource.g:1841:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
+            // InternalGridSource.g:1842:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1859:2: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
+            // InternalGridSource.g:1842:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
             int alt21=2;
             int LA21_0 = input.LA(1);
 
@@ -5054,15 +5124,15 @@
             }
             switch (alt21) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1859:4: otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
+                    // InternalGridSource.g:1843:4: otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
                     {
-                    otherlv_0=(Token)match(input,41,FOLLOW_41_in_ruleXFunctionTypeRef4319); if (state.failed) return current;
+                    otherlv_0=(Token)match(input,41,FOLLOW_40); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
-                          
+                      				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1863:1: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
+                    // InternalGridSource.g:1847:4: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
                     int alt20=2;
                     int LA20_0 = input.LA(1);
 
@@ -5071,36 +5141,36 @@
                     }
                     switch (alt20) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1863:2: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
+                            // InternalGridSource.g:1848:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                             {
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1863:2: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1864:1: (lv_paramTypes_1_0= ruleJvmTypeReference )
+                            // InternalGridSource.g:1848:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
+                            // InternalGridSource.g:1849:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                             {
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1864:1: (lv_paramTypes_1_0= ruleJvmTypeReference )
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1865:3: lv_paramTypes_1_0= ruleJvmTypeReference
+                            // InternalGridSource.g:1849:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
+                            // InternalGridSource.g:1850:7: lv_paramTypes_1_0= ruleJvmTypeReference
                             {
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0()); 
-                              	    
+
+                              							newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
+                              						
                             }
-                            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleXFunctionTypeRef4341);
+                            pushFollow(FOLLOW_41);
                             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, 
-                                      		"JvmTypeReference");
-                              	        afterParserOrEnumRuleCall();
-                              	    
+                              							if (current==null) {
+                              								current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
+                              							}
+                              							add(
+                              								current,
+                              								"paramTypes",
+                              								lv_paramTypes_1_0,
+                              								"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                              							afterParserOrEnumRuleCall();
+                              						
                             }
 
                             }
@@ -5108,7 +5178,7 @@
 
                             }
 
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1881:2: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
+                            // InternalGridSource.g:1867:5: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                             loop19:
                             do {
                                 int alt19=2;
@@ -5121,42 +5191,42 @@
 
                                 switch (alt19) {
                             	case 1 :
-                            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1881:4: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
+                            	    // InternalGridSource.g:1868:6: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                             	    {
-                            	    otherlv_2=(Token)match(input,55,FOLLOW_55_in_ruleXFunctionTypeRef4354); if (state.failed) return current;
+                            	    otherlv_2=(Token)match(input,55,FOLLOW_5); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
 
-                            	          	newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
-                            	          
+                            	      						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
+                            	      					
                             	    }
-                            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1885:1: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
-                            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1886:1: (lv_paramTypes_3_0= ruleJvmTypeReference )
+                            	    // InternalGridSource.g:1872:6: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
+                            	    // InternalGridSource.g:1873:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                             	    {
-                            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1886:1: (lv_paramTypes_3_0= ruleJvmTypeReference )
-                            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1887:3: lv_paramTypes_3_0= ruleJvmTypeReference
+                            	    // InternalGridSource.g:1873:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
+                            	    // InternalGridSource.g:1874:8: lv_paramTypes_3_0= ruleJvmTypeReference
                             	    {
                             	    if ( state.backtracking==0 ) {
-                            	       
-                            	      	        newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0()); 
-                            	      	    
+
+                            	      								newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
+                            	      							
                             	    }
-                            	    pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleXFunctionTypeRef4375);
+                            	    pushFollow(FOLLOW_41);
                             	    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, 
-                            	              		"JvmTypeReference");
-                            	      	        afterParserOrEnumRuleCall();
-                            	      	    
+                            	      								if (current==null) {
+                            	      									current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
+                            	      								}
+                            	      								add(
+                            	      									current,
+                            	      									"paramTypes",
+                            	      									lv_paramTypes_3_0,
+                            	      									"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+                            	      								afterParserOrEnumRuleCall();
+                            	      							
                             	    }
 
                             	    }
@@ -5179,11 +5249,11 @@
 
                     }
 
-                    otherlv_4=(Token)match(input,42,FOLLOW_42_in_ruleXFunctionTypeRef4391); if (state.failed) return current;
+                    otherlv_4=(Token)match(input,42,FOLLOW_42); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
-                          
+                      				newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
+                      			
                     }
 
                     }
@@ -5191,40 +5261,40 @@
 
             }
 
-            otherlv_5=(Token)match(input,56,FOLLOW_56_in_ruleXFunctionTypeRef4405); if (state.failed) return current;
+            otherlv_5=(Token)match(input,56,FOLLOW_5); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
-                  
+              			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1911:1: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1912:1: (lv_returnType_6_0= ruleJvmTypeReference )
+            // InternalGridSource.g:1902:3: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
+            // InternalGridSource.g:1903:4: (lv_returnType_6_0= ruleJvmTypeReference )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1912:1: (lv_returnType_6_0= ruleJvmTypeReference )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1913:3: lv_returnType_6_0= ruleJvmTypeReference
+            // InternalGridSource.g:1903:4: (lv_returnType_6_0= ruleJvmTypeReference )
+            // InternalGridSource.g:1904:5: lv_returnType_6_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0());
+              				
             }
-            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleXFunctionTypeRef4426);
+            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, 
-                      		"JvmTypeReference");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
+              					}
+              					set(
+              						current,
+              						"returnType",
+              						lv_returnType_6_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -5239,14 +5309,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5255,7 +5327,7 @@
 
 
     // $ANTLR start "entryRuleJvmParameterizedTypeReference"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1937:1: entryRuleJvmParameterizedTypeReference returns [EObject current=null] : iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF ;
+    // InternalGridSource.g:1925:1: entryRuleJvmParameterizedTypeReference returns [EObject current=null] : iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF ;
     public final EObject entryRuleJvmParameterizedTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -5263,13 +5335,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1938:2: (iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1939:2: iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF
+            // InternalGridSource.g:1925:70: (iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF )
+            // InternalGridSource.g:1926:2: iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
             }
-            pushFollow(FOLLOW_ruleJvmParameterizedTypeReference_in_entryRuleJvmParameterizedTypeReference4462);
+            pushFollow(FOLLOW_1);
             iv_ruleJvmParameterizedTypeReference=ruleJvmParameterizedTypeReference();
 
             state._fsp--;
@@ -5277,16 +5349,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleJvmParameterizedTypeReference; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmParameterizedTypeReference4472); 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;
@@ -5295,7 +5367,7 @@
 
 
     // $ANTLR start "ruleJvmParameterizedTypeReference"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1946: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= '>' )? )* )? ) ;
+    // InternalGridSource.g:1932: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;
 
@@ -5315,42 +5387,43 @@
         EObject lv_arguments_12_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1949:28: ( ( ( ( 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= '>' )? )* )? ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1950:1: ( ( ( 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= '>' )? )* )? )
+            // InternalGridSource.g:1938: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= '>' )? )* )? ) )
+            // InternalGridSource.g:1939: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= '>' )? )* )? )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1950:1: ( ( ( 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= '>' )? )* )? )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1950: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= '>' )? )* )?
+            // InternalGridSource.g:1939: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= '>' )? )* )? )
+            // InternalGridSource.g:1940: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= '>' )? )* )?
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1950:2: ( ( ruleQualifiedName ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1951:1: ( ruleQualifiedName )
+            // InternalGridSource.g:1940:3: ( ( ruleQualifiedName ) )
+            // InternalGridSource.g:1941:4: ( ruleQualifiedName )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1951:1: ( ruleQualifiedName )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1952:3: ruleQualifiedName
+            // InternalGridSource.g:1941:4: ( ruleQualifiedName )
+            // InternalGridSource.g:1942:5: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
 
-              			if (current==null) {
-              	            current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
-              	        }
-                      
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
+              					}
+              				
             }
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0());
+              				
             }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleJvmParameterizedTypeReference4520);
+            pushFollow(FOLLOW_43);
             ruleQualifiedName();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               
-              	        afterParserOrEnumRuleCall();
-              	    
+
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -5358,7 +5431,7 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1965:2: ( ( ( '<' )=>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= '>' )? )* )?
+            // InternalGridSource.g:1956: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 alt26=2;
             int LA26_0 = input.LA(1);
 
@@ -5367,48 +5440,48 @@
             }
             switch (alt26) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1965: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= '>' )? )*
+                    // InternalGridSource.g:1957: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= '>' )? )*
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1965:3: ( ( '<' )=>otherlv_1= '<' )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1965:4: ( '<' )=>otherlv_1= '<'
+                    // InternalGridSource.g:1957:4: ( ( '<' )=>otherlv_1= '<' )
+                    // InternalGridSource.g:1958:5: ( '<' )=>otherlv_1= '<'
                     {
-                    otherlv_1=(Token)match(input,57,FOLLOW_57_in_ruleJvmParameterizedTypeReference4541); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,57,FOLLOW_44); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
-                          
+                      					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
+                      				
                     }
 
                     }
 
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1970:2: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1971:1: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalGridSource.g:1964:4: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
+                    // InternalGridSource.g:1965:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1971:1: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1972:3: lv_arguments_2_0= ruleJvmArgumentTypeReference
+                    // InternalGridSource.g:1965:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalGridSource.g:1966:6: lv_arguments_2_0= ruleJvmArgumentTypeReference
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_ruleJvmParameterizedTypeReference4563);
+                    pushFollow(FOLLOW_45);
                     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, 
-                              		"JvmArgumentTypeReference");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
+                      						}
+                      						add(
+                      							current,
+                      							"arguments",
+                      							lv_arguments_2_0,
+                      							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -5416,7 +5489,7 @@
 
                     }
 
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1988:2: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
+                    // InternalGridSource.g:1983:4: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                     loop22:
                     do {
                         int alt22=2;
@@ -5429,42 +5502,42 @@
 
                         switch (alt22) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1988:4: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalGridSource.g:1984:5: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                     	    {
-                    	    otherlv_3=(Token)match(input,55,FOLLOW_55_in_ruleJvmParameterizedTypeReference4576); if (state.failed) return current;
+                    	    otherlv_3=(Token)match(input,55,FOLLOW_44); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	          	newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
-                    	          
+                    	      					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
+                    	      				
                     	    }
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1992:1: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1993:1: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalGridSource.g:1988:5: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalGridSource.g:1989:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1993:1: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1994:3: lv_arguments_4_0= ruleJvmArgumentTypeReference
+                    	    // InternalGridSource.g:1989:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalGridSource.g:1990:7: lv_arguments_4_0= ruleJvmArgumentTypeReference
                     	    {
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); 
-                    	      	    
+
+                    	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
+                    	      						
                     	    }
-                    	    pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_ruleJvmParameterizedTypeReference4597);
+                    	    pushFollow(FOLLOW_45);
                     	    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, 
-                    	              		"JvmArgumentTypeReference");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"arguments",
+                    	      								lv_arguments_4_0,
+                    	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -5481,13 +5554,13 @@
                         }
                     } while (true);
 
-                    otherlv_5=(Token)match(input,58,FOLLOW_58_in_ruleJvmParameterizedTypeReference4611); if (state.failed) return current;
+                    otherlv_5=(Token)match(input,58,FOLLOW_17); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
-                          
+                      				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
+                      			
                     }
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2014:1: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
+                    // InternalGridSource.g:2012:4: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
                     loop25:
                     do {
                         int alt25=2;
@@ -5500,32 +5573,32 @@
 
                         switch (alt25) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2014:2: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
+                    	    // InternalGridSource.g:2013:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2014:2: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2014:3: ( ( () '.' ) )=> ( () otherlv_7= '.' )
+                    	    // InternalGridSource.g:2013:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
+                    	    // InternalGridSource.g:2014:6: ( ( () '.' ) )=> ( () otherlv_7= '.' )
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2016:5: ( () otherlv_7= '.' )
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2016:6: () otherlv_7= '.'
+                    	    // InternalGridSource.g:2020:6: ( () otherlv_7= '.' )
+                    	    // InternalGridSource.g:2021:7: () otherlv_7= '.'
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2016:6: ()
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2017:5: 
+                    	    // InternalGridSource.g:2021:7: ()
+                    	    // InternalGridSource.g:2022:8: 
                     	    {
                     	    if ( state.backtracking==0 ) {
 
-                    	              current = forceCreateModelElementAndSet(
-                    	                  grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
-                    	                  current);
-                    	          
+                    	      								current = forceCreateModelElementAndSet(
+                    	      									grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
+                    	      									current);
+                    	      							
                     	    }
 
                     	    }
 
-                    	    otherlv_7=(Token)match(input,26,FOLLOW_26_in_ruleJvmParameterizedTypeReference4647); if (state.failed) return current;
+                    	    otherlv_7=(Token)match(input,26,FOLLOW_3); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	          	newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
-                    	          
+                    	      							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
+                    	      						
                     	    }
 
                     	    }
@@ -5533,33 +5606,33 @@
 
                     	    }
 
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2026:3: ( ( ruleValidID ) )
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2027:1: ( ruleValidID )
+                    	    // InternalGridSource.g:2034:5: ( ( ruleValidID ) )
+                    	    // InternalGridSource.g:2035:6: ( ruleValidID )
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2027:1: ( ruleValidID )
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2028:3: ruleValidID
+                    	    // InternalGridSource.g:2035:6: ( ruleValidID )
+                    	    // InternalGridSource.g:2036:7: ruleValidID
                     	    {
                     	    if ( state.backtracking==0 ) {
 
-                    	      			if (current==null) {
-                    	      	            current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
-                    	      	        }
-                    	              
+                    	      							if (current==null) {
+                    	      								current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
+                    	      							}
+                    	      						
                     	    }
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0()); 
-                    	      	    
+
+                    	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0());
+                    	      						
                     	    }
-                    	    pushFollow(FOLLOW_ruleValidID_in_ruleJvmParameterizedTypeReference4672);
+                    	    pushFollow(FOLLOW_46);
                     	    ruleValidID();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -5567,7 +5640,7 @@
 
                     	    }
 
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2041:2: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
+                    	    // InternalGridSource.g:2050:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                     	    int alt24=2;
                     	    int LA24_0 = input.LA(1);
 
@@ -5576,48 +5649,48 @@
                     	    }
                     	    switch (alt24) {
                     	        case 1 :
-                    	            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2041:3: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
+                    	            // InternalGridSource.g:2051:6: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
                     	            {
-                    	            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2041:3: ( ( '<' )=>otherlv_9= '<' )
-                    	            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2041:4: ( '<' )=>otherlv_9= '<'
+                    	            // InternalGridSource.g:2051:6: ( ( '<' )=>otherlv_9= '<' )
+                    	            // InternalGridSource.g:2052:7: ( '<' )=>otherlv_9= '<'
                     	            {
-                    	            otherlv_9=(Token)match(input,57,FOLLOW_57_in_ruleJvmParameterizedTypeReference4693); if (state.failed) return current;
+                    	            otherlv_9=(Token)match(input,57,FOLLOW_44); if (state.failed) return current;
                     	            if ( state.backtracking==0 ) {
 
-                    	                  	newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
-                    	                  
+                    	              							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
+                    	              						
                     	            }
 
                     	            }
 
-                    	            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2046:2: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
-                    	            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2047:1: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
+                    	            // InternalGridSource.g:2058:6: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
+                    	            // InternalGridSource.g:2059:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                     	            {
-                    	            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2047:1: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
-                    	            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2048:3: lv_arguments_10_0= ruleJvmArgumentTypeReference
+                    	            // InternalGridSource.g:2059:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
+                    	            // InternalGridSource.g:2060:8: lv_arguments_10_0= ruleJvmArgumentTypeReference
                     	            {
                     	            if ( state.backtracking==0 ) {
-                    	               
-                    	              	        newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0()); 
-                    	              	    
+
+                    	              								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
+                    	              							
                     	            }
-                    	            pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_ruleJvmParameterizedTypeReference4715);
+                    	            pushFollow(FOLLOW_45);
                     	            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, 
-                    	                      		"JvmArgumentTypeReference");
-                    	              	        afterParserOrEnumRuleCall();
-                    	              	    
+                    	              								if (current==null) {
+                    	              									current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
+                    	              								}
+                    	              								add(
+                    	              									current,
+                    	              									"arguments",
+                    	              									lv_arguments_10_0,
+                    	              									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+                    	              								afterParserOrEnumRuleCall();
+                    	              							
                     	            }
 
                     	            }
@@ -5625,7 +5698,7 @@
 
                     	            }
 
-                    	            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2064:2: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
+                    	            // InternalGridSource.g:2077:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
                     	            loop23:
                     	            do {
                     	                int alt23=2;
@@ -5638,42 +5711,42 @@
 
                     	                switch (alt23) {
                     	            	case 1 :
-                    	            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2064:4: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
+                    	            	    // InternalGridSource.g:2078:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                     	            	    {
-                    	            	    otherlv_11=(Token)match(input,55,FOLLOW_55_in_ruleJvmParameterizedTypeReference4728); if (state.failed) return current;
+                    	            	    otherlv_11=(Token)match(input,55,FOLLOW_44); if (state.failed) return current;
                     	            	    if ( state.backtracking==0 ) {
 
-                    	            	          	newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
-                    	            	          
+                    	            	      							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
+                    	            	      						
                     	            	    }
-                    	            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2068:1: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
-                    	            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2069:1: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
+                    	            	    // InternalGridSource.g:2082:7: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
+                    	            	    // InternalGridSource.g:2083:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                     	            	    {
-                    	            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2069:1: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
-                    	            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2070:3: lv_arguments_12_0= ruleJvmArgumentTypeReference
+                    	            	    // InternalGridSource.g:2083:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
+                    	            	    // InternalGridSource.g:2084:9: lv_arguments_12_0= ruleJvmArgumentTypeReference
                     	            	    {
                     	            	    if ( state.backtracking==0 ) {
-                    	            	       
-                    	            	      	        newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0()); 
-                    	            	      	    
+
+                    	            	      									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
+                    	            	      								
                     	            	    }
-                    	            	    pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_ruleJvmParameterizedTypeReference4749);
+                    	            	    pushFollow(FOLLOW_45);
                     	            	    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, 
-                    	            	              		"JvmArgumentTypeReference");
-                    	            	      	        afterParserOrEnumRuleCall();
-                    	            	      	    
+                    	            	      									if (current==null) {
+                    	            	      										current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
+                    	            	      									}
+                    	            	      									add(
+                    	            	      										current,
+                    	            	      										"arguments",
+                    	            	      										lv_arguments_12_0,
+                    	            	      										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
+                    	            	      									afterParserOrEnumRuleCall();
+                    	            	      								
                     	            	    }
 
                     	            	    }
@@ -5690,11 +5763,11 @@
                     	                }
                     	            } while (true);
 
-                    	            otherlv_13=(Token)match(input,58,FOLLOW_58_in_ruleJvmParameterizedTypeReference4763); if (state.failed) return current;
+                    	            otherlv_13=(Token)match(input,58,FOLLOW_17); if (state.failed) return current;
                     	            if ( state.backtracking==0 ) {
 
-                    	                  	newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
-                    	                  
+                    	              						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
+                    	              					
                     	            }
 
                     	            }
@@ -5724,14 +5797,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5740,7 +5815,7 @@
 
 
     // $ANTLR start "entryRuleJvmArgumentTypeReference"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2098:1: entryRuleJvmArgumentTypeReference returns [EObject current=null] : iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF ;
+    // InternalGridSource.g:2113:1: entryRuleJvmArgumentTypeReference returns [EObject current=null] : iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF ;
     public final EObject entryRuleJvmArgumentTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -5748,13 +5823,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2099:2: (iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2100:2: iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF
+            // InternalGridSource.g:2113:65: (iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF )
+            // InternalGridSource.g:2114:2: iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceRule()); 
             }
-            pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_entryRuleJvmArgumentTypeReference4805);
+            pushFollow(FOLLOW_1);
             iv_ruleJvmArgumentTypeReference=ruleJvmArgumentTypeReference();
 
             state._fsp--;
@@ -5762,16 +5837,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleJvmArgumentTypeReference; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmArgumentTypeReference4815); 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;
@@ -5780,7 +5855,7 @@
 
 
     // $ANTLR start "ruleJvmArgumentTypeReference"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2107:1: ruleJvmArgumentTypeReference returns [EObject current=null] : (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) ;
+    // InternalGridSource.g:2120:1: ruleJvmArgumentTypeReference returns [EObject current=null] : (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) ;
     public final EObject ruleJvmArgumentTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -5789,13 +5864,14 @@
         EObject this_JvmWildcardTypeReference_1 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2110:28: ( (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2111:1: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
+            // InternalGridSource.g:2126:2: ( (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) )
+            // InternalGridSource.g:2127:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2111:1: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
+            // InternalGridSource.g:2127:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
             int alt27=2;
             int LA27_0 = input.LA(1);
 
@@ -5814,45 +5890,45 @@
             }
             switch (alt27) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2112:5: this_JvmTypeReference_0= ruleJvmTypeReference
+                    // InternalGridSource.g:2128:3: this_JvmTypeReference_0= ruleJvmTypeReference
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleJvmArgumentTypeReference4862);
+                    pushFollow(FOLLOW_2);
                     this_JvmTypeReference_0=ruleJvmTypeReference();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_JvmTypeReference_0; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_JvmTypeReference_0;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2122:5: this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference
+                    // InternalGridSource.g:2137:3: this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference
                     {
                     if ( state.backtracking==0 ) {
-                       
-                              newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); 
-                          
+
+                      			newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1());
+                      		
                     }
-                    pushFollow(FOLLOW_ruleJvmWildcardTypeReference_in_ruleJvmArgumentTypeReference4889);
+                    pushFollow(FOLLOW_2);
                     this_JvmWildcardTypeReference_1=ruleJvmWildcardTypeReference();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                              current = this_JvmWildcardTypeReference_1; 
-                              afterParserOrEnumRuleCall();
-                          
+
+                      			current = this_JvmWildcardTypeReference_1;
+                      			afterParserOrEnumRuleCall();
+                      		
                     }
 
                     }
@@ -5864,14 +5940,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -5880,7 +5958,7 @@
 
 
     // $ANTLR start "entryRuleJvmWildcardTypeReference"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2138:1: entryRuleJvmWildcardTypeReference returns [EObject current=null] : iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF ;
+    // InternalGridSource.g:2149:1: entryRuleJvmWildcardTypeReference returns [EObject current=null] : iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF ;
     public final EObject entryRuleJvmWildcardTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -5888,13 +5966,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2139:2: (iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2140:2: iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF
+            // InternalGridSource.g:2149:65: (iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF )
+            // InternalGridSource.g:2150:2: iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceRule()); 
             }
-            pushFollow(FOLLOW_ruleJvmWildcardTypeReference_in_entryRuleJvmWildcardTypeReference4924);
+            pushFollow(FOLLOW_1);
             iv_ruleJvmWildcardTypeReference=ruleJvmWildcardTypeReference();
 
             state._fsp--;
@@ -5902,16 +5980,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleJvmWildcardTypeReference; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmWildcardTypeReference4934); 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;
@@ -5920,7 +5998,7 @@
 
 
     // $ANTLR start "ruleJvmWildcardTypeReference"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2147: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 ) )* ) )? ) ;
+    // InternalGridSource.g:2156: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;
 
@@ -5934,35 +6012,36 @@
         EObject lv_constraints_5_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2150:28: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2151:1: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
+            // InternalGridSource.g:2162:2: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
+            // InternalGridSource.g:2163:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2151:1: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2151:2: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
+            // InternalGridSource.g:2163:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
+            // InternalGridSource.g:2164:3: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2151:2: ()
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2152:5: 
+            // InternalGridSource.g:2164:3: ()
+            // InternalGridSource.g:2165:4: 
             {
             if ( state.backtracking==0 ) {
 
-                      current = forceCreateModelElement(
-                          grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
-                          current);
-                  
+              				current = forceCreateModelElement(
+              					grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
+              					current);
+              			
             }
 
             }
 
-            otherlv_1=(Token)match(input,59,FOLLOW_59_in_ruleJvmWildcardTypeReference4980); if (state.failed) return current;
+            otherlv_1=(Token)match(input,59,FOLLOW_47); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
-                  
+              			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2161:1: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
+            // InternalGridSource.g:2175:3: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
             int alt30=3;
             int LA30_0 = input.LA(1);
 
@@ -5974,39 +6053,39 @@
             }
             switch (alt30) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2161:2: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
+                    // InternalGridSource.g:2176:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2161:2: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2161:3: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
+                    // InternalGridSource.g:2176:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
+                    // InternalGridSource.g:2177:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2161:3: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2162:1: (lv_constraints_2_0= ruleJvmUpperBound )
+                    // InternalGridSource.g:2177:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
+                    // InternalGridSource.g:2178:6: (lv_constraints_2_0= ruleJvmUpperBound )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2162:1: (lv_constraints_2_0= ruleJvmUpperBound )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2163:3: lv_constraints_2_0= ruleJvmUpperBound
+                    // InternalGridSource.g:2178:6: (lv_constraints_2_0= ruleJvmUpperBound )
+                    // InternalGridSource.g:2179:7: lv_constraints_2_0= ruleJvmUpperBound
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0()); 
-                      	    
+
+                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
+                      						
                     }
-                    pushFollow(FOLLOW_ruleJvmUpperBound_in_ruleJvmWildcardTypeReference5003);
+                    pushFollow(FOLLOW_48);
                     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, 
-                              		"JvmUpperBound");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
+                      							}
+                      							add(
+                      								current,
+                      								"constraints",
+                      								lv_constraints_2_0,
+                      								"org.eclipse.xtext.xbase.Xtype.JvmUpperBound");
+                      							afterParserOrEnumRuleCall();
+                      						
                     }
 
                     }
@@ -6014,7 +6093,7 @@
 
                     }
 
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2179:2: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
+                    // InternalGridSource.g:2196:5: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                     loop28:
                     do {
                         int alt28=2;
@@ -6027,33 +6106,33 @@
 
                         switch (alt28) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2180:1: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
+                    	    // InternalGridSource.g:2197:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2180:1: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2181:3: lv_constraints_3_0= ruleJvmUpperBoundAnded
+                    	    // InternalGridSource.g:2197:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
+                    	    // InternalGridSource.g:2198:7: lv_constraints_3_0= ruleJvmUpperBoundAnded
                     	    {
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0()); 
-                    	      	    
+
+                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
+                    	      						
                     	    }
-                    	    pushFollow(FOLLOW_ruleJvmUpperBoundAnded_in_ruleJvmWildcardTypeReference5024);
+                    	    pushFollow(FOLLOW_48);
                     	    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, 
-                    	              		"JvmUpperBoundAnded");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"constraints",
+                    	      								lv_constraints_3_0,
+                    	      								"org.eclipse.xtext.xbase.Xtype.JvmUpperBoundAnded");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -6074,39 +6153,39 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2198:6: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
+                    // InternalGridSource.g:2217:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2198:6: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2198:7: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
+                    // InternalGridSource.g:2217:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
+                    // InternalGridSource.g:2218:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2198:7: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2199:1: (lv_constraints_4_0= ruleJvmLowerBound )
+                    // InternalGridSource.g:2218:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
+                    // InternalGridSource.g:2219:6: (lv_constraints_4_0= ruleJvmLowerBound )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2199:1: (lv_constraints_4_0= ruleJvmLowerBound )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2200:3: lv_constraints_4_0= ruleJvmLowerBound
+                    // InternalGridSource.g:2219:6: (lv_constraints_4_0= ruleJvmLowerBound )
+                    // InternalGridSource.g:2220:7: lv_constraints_4_0= ruleJvmLowerBound
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0()); 
-                      	    
+
+                      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
+                      						
                     }
-                    pushFollow(FOLLOW_ruleJvmLowerBound_in_ruleJvmWildcardTypeReference5054);
+                    pushFollow(FOLLOW_48);
                     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, 
-                              		"JvmLowerBound");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
+                      							}
+                      							add(
+                      								current,
+                      								"constraints",
+                      								lv_constraints_4_0,
+                      								"org.eclipse.xtext.xbase.Xtype.JvmLowerBound");
+                      							afterParserOrEnumRuleCall();
+                      						
                     }
 
                     }
@@ -6114,7 +6193,7 @@
 
                     }
 
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2216:2: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
+                    // InternalGridSource.g:2237:5: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                     loop29:
                     do {
                         int alt29=2;
@@ -6127,33 +6206,33 @@
 
                         switch (alt29) {
                     	case 1 :
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2217:1: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
+                    	    // InternalGridSource.g:2238:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                     	    {
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2217:1: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
-                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2218:3: lv_constraints_5_0= ruleJvmLowerBoundAnded
+                    	    // InternalGridSource.g:2238:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
+                    	    // InternalGridSource.g:2239:7: lv_constraints_5_0= ruleJvmLowerBoundAnded
                     	    {
                     	    if ( state.backtracking==0 ) {
-                    	       
-                    	      	        newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0()); 
-                    	      	    
+
+                    	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
+                    	      						
                     	    }
-                    	    pushFollow(FOLLOW_ruleJvmLowerBoundAnded_in_ruleJvmWildcardTypeReference5075);
+                    	    pushFollow(FOLLOW_48);
                     	    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, 
-                    	              		"JvmLowerBoundAnded");
-                    	      	        afterParserOrEnumRuleCall();
-                    	      	    
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"constraints",
+                    	      								lv_constraints_5_0,
+                    	      								"org.eclipse.xtext.xbase.Xtype.JvmLowerBoundAnded");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -6183,14 +6262,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6199,7 +6280,7 @@
 
 
     // $ANTLR start "entryRuleJvmUpperBound"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2242:1: entryRuleJvmUpperBound returns [EObject current=null] : iv_ruleJvmUpperBound= ruleJvmUpperBound EOF ;
+    // InternalGridSource.g:2262:1: entryRuleJvmUpperBound returns [EObject current=null] : iv_ruleJvmUpperBound= ruleJvmUpperBound EOF ;
     public final EObject entryRuleJvmUpperBound() throws RecognitionException {
         EObject current = null;
 
@@ -6207,13 +6288,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2243:2: (iv_ruleJvmUpperBound= ruleJvmUpperBound EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2244:2: iv_ruleJvmUpperBound= ruleJvmUpperBound EOF
+            // InternalGridSource.g:2262:54: (iv_ruleJvmUpperBound= ruleJvmUpperBound EOF )
+            // InternalGridSource.g:2263:2: iv_ruleJvmUpperBound= ruleJvmUpperBound EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmUpperBoundRule()); 
             }
-            pushFollow(FOLLOW_ruleJvmUpperBound_in_entryRuleJvmUpperBound5115);
+            pushFollow(FOLLOW_1);
             iv_ruleJvmUpperBound=ruleJvmUpperBound();
 
             state._fsp--;
@@ -6221,16 +6302,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleJvmUpperBound; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmUpperBound5125); 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;
@@ -6239,7 +6320,7 @@
 
 
     // $ANTLR start "ruleJvmUpperBound"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2251:1: ruleJvmUpperBound returns [EObject current=null] : (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    // InternalGridSource.g:2269:1: ruleJvmUpperBound returns [EObject current=null] : (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleJvmUpperBound() throws RecognitionException {
         EObject current = null;
 
@@ -6247,49 +6328,50 @@
         EObject lv_typeReference_1_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2254:28: ( (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2255:1: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalGridSource.g:2275:2: ( (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalGridSource.g:2276:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2255:1: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2255:3: otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalGridSource.g:2276:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalGridSource.g:2277:3: otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
             {
-            otherlv_0=(Token)match(input,60,FOLLOW_60_in_ruleJvmUpperBound5162); if (state.failed) return current;
+            otherlv_0=(Token)match(input,60,FOLLOW_5); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2259:1: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2260:1: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalGridSource.g:2281:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalGridSource.g:2282:4: (lv_typeReference_1_0= ruleJvmTypeReference )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2260:1: (lv_typeReference_1_0= ruleJvmTypeReference )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2261:3: lv_typeReference_1_0= ruleJvmTypeReference
+            // InternalGridSource.g:2282:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalGridSource.g:2283:5: lv_typeReference_1_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
+              				
             }
-            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleJvmUpperBound5183);
+            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, 
-                      		"JvmTypeReference");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getJvmUpperBoundRule());
+              					}
+              					set(
+              						current,
+              						"typeReference",
+              						lv_typeReference_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -6304,14 +6386,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6320,7 +6404,7 @@
 
 
     // $ANTLR start "entryRuleJvmUpperBoundAnded"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2285:1: entryRuleJvmUpperBoundAnded returns [EObject current=null] : iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF ;
+    // InternalGridSource.g:2304:1: entryRuleJvmUpperBoundAnded returns [EObject current=null] : iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF ;
     public final EObject entryRuleJvmUpperBoundAnded() throws RecognitionException {
         EObject current = null;
 
@@ -6328,13 +6412,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2286:2: (iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2287:2: iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF
+            // InternalGridSource.g:2304:59: (iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF )
+            // InternalGridSource.g:2305:2: iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmUpperBoundAndedRule()); 
             }
-            pushFollow(FOLLOW_ruleJvmUpperBoundAnded_in_entryRuleJvmUpperBoundAnded5219);
+            pushFollow(FOLLOW_1);
             iv_ruleJvmUpperBoundAnded=ruleJvmUpperBoundAnded();
 
             state._fsp--;
@@ -6342,16 +6426,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleJvmUpperBoundAnded; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmUpperBoundAnded5229); 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;
@@ -6360,7 +6444,7 @@
 
 
     // $ANTLR start "ruleJvmUpperBoundAnded"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2294:1: ruleJvmUpperBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    // InternalGridSource.g:2311:1: ruleJvmUpperBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleJvmUpperBoundAnded() throws RecognitionException {
         EObject current = null;
 
@@ -6368,49 +6452,50 @@
         EObject lv_typeReference_1_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2297:28: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2298:1: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalGridSource.g:2317:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalGridSource.g:2318:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2298:1: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2298:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalGridSource.g:2318:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalGridSource.g:2319:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
             {
-            otherlv_0=(Token)match(input,61,FOLLOW_61_in_ruleJvmUpperBoundAnded5266); if (state.failed) return current;
+            otherlv_0=(Token)match(input,61,FOLLOW_5); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2302:1: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2303:1: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalGridSource.g:2323:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalGridSource.g:2324:4: (lv_typeReference_1_0= ruleJvmTypeReference )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2303:1: (lv_typeReference_1_0= ruleJvmTypeReference )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2304:3: lv_typeReference_1_0= ruleJvmTypeReference
+            // InternalGridSource.g:2324:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalGridSource.g:2325:5: lv_typeReference_1_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
+              				
             }
-            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleJvmUpperBoundAnded5287);
+            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, 
-                      		"JvmTypeReference");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getJvmUpperBoundAndedRule());
+              					}
+              					set(
+              						current,
+              						"typeReference",
+              						lv_typeReference_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -6425,14 +6510,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 +6528,7 @@
 
 
     // $ANTLR start "entryRuleJvmLowerBound"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2328:1: entryRuleJvmLowerBound returns [EObject current=null] : iv_ruleJvmLowerBound= ruleJvmLowerBound EOF ;
+    // InternalGridSource.g:2346:1: entryRuleJvmLowerBound returns [EObject current=null] : iv_ruleJvmLowerBound= ruleJvmLowerBound EOF ;
     public final EObject entryRuleJvmLowerBound() throws RecognitionException {
         EObject current = null;
 
@@ -6449,13 +6536,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2329:2: (iv_ruleJvmLowerBound= ruleJvmLowerBound EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2330:2: iv_ruleJvmLowerBound= ruleJvmLowerBound EOF
+            // InternalGridSource.g:2346:54: (iv_ruleJvmLowerBound= ruleJvmLowerBound EOF )
+            // InternalGridSource.g:2347:2: iv_ruleJvmLowerBound= ruleJvmLowerBound EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmLowerBoundRule()); 
             }
-            pushFollow(FOLLOW_ruleJvmLowerBound_in_entryRuleJvmLowerBound5323);
+            pushFollow(FOLLOW_1);
             iv_ruleJvmLowerBound=ruleJvmLowerBound();
 
             state._fsp--;
@@ -6463,16 +6550,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleJvmLowerBound; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmLowerBound5333); 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 +6568,7 @@
 
 
     // $ANTLR start "ruleJvmLowerBound"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2337:1: ruleJvmLowerBound returns [EObject current=null] : (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    // InternalGridSource.g:2353:1: ruleJvmLowerBound returns [EObject current=null] : (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleJvmLowerBound() throws RecognitionException {
         EObject current = null;
 
@@ -6489,49 +6576,50 @@
         EObject lv_typeReference_1_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2340:28: ( (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2341:1: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalGridSource.g:2359:2: ( (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalGridSource.g:2360:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2341:1: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2341:3: otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalGridSource.g:2360:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalGridSource.g:2361:3: otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
             {
-            otherlv_0=(Token)match(input,62,FOLLOW_62_in_ruleJvmLowerBound5370); if (state.failed) return current;
+            otherlv_0=(Token)match(input,62,FOLLOW_5); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2345:1: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2346:1: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalGridSource.g:2365:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalGridSource.g:2366:4: (lv_typeReference_1_0= ruleJvmTypeReference )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2346:1: (lv_typeReference_1_0= ruleJvmTypeReference )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2347:3: lv_typeReference_1_0= ruleJvmTypeReference
+            // InternalGridSource.g:2366:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalGridSource.g:2367:5: lv_typeReference_1_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
+              				
             }
-            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleJvmLowerBound5391);
+            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, 
-                      		"JvmTypeReference");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getJvmLowerBoundRule());
+              					}
+              					set(
+              						current,
+              						"typeReference",
+              						lv_typeReference_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -6546,14 +6634,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6562,7 +6652,7 @@
 
 
     // $ANTLR start "entryRuleJvmLowerBoundAnded"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2371:1: entryRuleJvmLowerBoundAnded returns [EObject current=null] : iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF ;
+    // InternalGridSource.g:2388:1: entryRuleJvmLowerBoundAnded returns [EObject current=null] : iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF ;
     public final EObject entryRuleJvmLowerBoundAnded() throws RecognitionException {
         EObject current = null;
 
@@ -6570,13 +6660,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2372:2: (iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2373:2: iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF
+            // InternalGridSource.g:2388:59: (iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF )
+            // InternalGridSource.g:2389:2: iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmLowerBoundAndedRule()); 
             }
-            pushFollow(FOLLOW_ruleJvmLowerBoundAnded_in_entryRuleJvmLowerBoundAnded5427);
+            pushFollow(FOLLOW_1);
             iv_ruleJvmLowerBoundAnded=ruleJvmLowerBoundAnded();
 
             state._fsp--;
@@ -6584,16 +6674,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleJvmLowerBoundAnded; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmLowerBoundAnded5437); 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;
@@ -6602,7 +6692,7 @@
 
 
     // $ANTLR start "ruleJvmLowerBoundAnded"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2380:1: ruleJvmLowerBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    // InternalGridSource.g:2395:1: ruleJvmLowerBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleJvmLowerBoundAnded() throws RecognitionException {
         EObject current = null;
 
@@ -6610,49 +6700,50 @@
         EObject lv_typeReference_1_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2383:28: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2384:1: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalGridSource.g:2401:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalGridSource.g:2402:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2384:1: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2384:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalGridSource.g:2402:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalGridSource.g:2403:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
             {
-            otherlv_0=(Token)match(input,61,FOLLOW_61_in_ruleJvmLowerBoundAnded5474); if (state.failed) return current;
+            otherlv_0=(Token)match(input,61,FOLLOW_5); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2388:1: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2389:1: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalGridSource.g:2407:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalGridSource.g:2408:4: (lv_typeReference_1_0= ruleJvmTypeReference )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2389:1: (lv_typeReference_1_0= ruleJvmTypeReference )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2390:3: lv_typeReference_1_0= ruleJvmTypeReference
+            // InternalGridSource.g:2408:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalGridSource.g:2409:5: lv_typeReference_1_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
-               
-              	        newCompositeNode(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
-              	    
+
+              					newCompositeNode(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0());
+              				
             }
-            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleJvmLowerBoundAnded5495);
+            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, 
-                      		"JvmTypeReference");
-              	        afterParserOrEnumRuleCall();
-              	    
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getJvmLowerBoundAndedRule());
+              					}
+              					set(
+              						current,
+              						"typeReference",
+              						lv_typeReference_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.JvmTypeReference");
+              					afterParserOrEnumRuleCall();
+              				
             }
 
             }
@@ -6667,14 +6758,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6683,7 +6776,7 @@
 
 
     // $ANTLR start "entryRuleQualifiedNameWithWildcard"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2416:1: entryRuleQualifiedNameWithWildcard returns [String current=null] : iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF ;
+    // InternalGridSource.g:2430:1: entryRuleQualifiedNameWithWildcard returns [String current=null] : iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF ;
     public final String entryRuleQualifiedNameWithWildcard() throws RecognitionException {
         String current = null;
 
@@ -6691,13 +6784,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2417:2: (iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2418:2: iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF
+            // InternalGridSource.g:2430:65: (iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF )
+            // InternalGridSource.g:2431:2: iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getQualifiedNameWithWildcardRule()); 
             }
-            pushFollow(FOLLOW_ruleQualifiedNameWithWildcard_in_entryRuleQualifiedNameWithWildcard5534);
+            pushFollow(FOLLOW_1);
             iv_ruleQualifiedNameWithWildcard=ruleQualifiedNameWithWildcard();
 
             state._fsp--;
@@ -6705,16 +6798,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleQualifiedNameWithWildcard.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedNameWithWildcard5545); 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;
@@ -6723,7 +6816,7 @@
 
 
     // $ANTLR start "ruleQualifiedNameWithWildcard"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2425:1: ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) ;
+    // InternalGridSource.g:2437:1: ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) ;
     public final AntlrDatatypeRuleToken ruleQualifiedNameWithWildcard() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -6731,48 +6824,49 @@
         AntlrDatatypeRuleToken this_QualifiedName_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2428:28: ( (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2429:1: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
+            // InternalGridSource.g:2443:2: ( (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) )
+            // InternalGridSource.g:2444:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2429:1: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2430:5: this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*'
+            // InternalGridSource.g:2444:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
+            // InternalGridSource.g:2445:3: this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*'
             {
             if ( state.backtracking==0 ) {
-               
-                      newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0()); 
-                  
+
+              			newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0());
+              		
             }
-            pushFollow(FOLLOW_ruleQualifiedName_in_ruleQualifiedNameWithWildcard5592);
+            pushFollow(FOLLOW_49);
             this_QualifiedName_0=ruleQualifiedName();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              		current.merge(this_QualifiedName_0);
-                  
+              			current.merge(this_QualifiedName_0);
+              		
             }
             if ( state.backtracking==0 ) {
-               
-                      afterParserOrEnumRuleCall();
-                  
-            }
-            kw=(Token)match(input,26,FOLLOW_26_in_ruleQualifiedNameWithWildcard5610); if (state.failed) return current;
-            if ( state.backtracking==0 ) {
 
-                      current.merge(kw);
-                      newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1()); 
-                  
+              			afterParserOrEnumRuleCall();
+              		
             }
-            kw=(Token)match(input,63,FOLLOW_63_in_ruleQualifiedNameWithWildcard5623); if (state.failed) return current;
+            kw=(Token)match(input,26,FOLLOW_50); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                      current.merge(kw);
-                      newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2()); 
-                  
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1());
+              		
+            }
+            kw=(Token)match(input,63,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			current.merge(kw);
+              			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2());
+              		
             }
 
             }
@@ -6781,14 +6875,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -6797,7 +6893,7 @@
 
 
     // $ANTLR start "entryRuleXImportDeclaration"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2462:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
+    // InternalGridSource.g:2469:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
     public final EObject entryRuleXImportDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -6805,13 +6901,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2463:2: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2464:2: iv_ruleXImportDeclaration= ruleXImportDeclaration EOF
+            // InternalGridSource.g:2469:59: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
+            // InternalGridSource.g:2470:2: iv_ruleXImportDeclaration= ruleXImportDeclaration EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXImportDeclarationRule()); 
             }
-            pushFollow(FOLLOW_ruleXImportDeclaration_in_entryRuleXImportDeclaration5665);
+            pushFollow(FOLLOW_1);
             iv_ruleXImportDeclaration=ruleXImportDeclaration();
 
             state._fsp--;
@@ -6819,16 +6915,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleXImportDeclaration; 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleXImportDeclaration5675); 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;
@@ -6837,7 +6933,7 @@
 
 
     // $ANTLR start "ruleXImportDeclaration"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2471:1: ruleXImportDeclaration returns [EObject current=null] : (otherlv_0= 'import' ( ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) ) ) (otherlv_8= ';' )? ) ;
+    // InternalGridSource.g:2476:1: ruleXImportDeclaration returns [EObject current=null] : (otherlv_0= 'import' ( ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) ) ) (otherlv_8= ';' )? ) ;
     public final EObject ruleXImportDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -6851,50 +6947,51 @@
         AntlrDatatypeRuleToken lv_importedNamespace_7_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2474:28: ( (otherlv_0= 'import' ( ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) ) ) (otherlv_8= ';' )? ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2475:1: (otherlv_0= 'import' ( ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) ) ) (otherlv_8= ';' )? )
+            // InternalGridSource.g:2482:2: ( (otherlv_0= 'import' ( ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) ) ) (otherlv_8= ';' )? ) )
+            // InternalGridSource.g:2483:2: (otherlv_0= 'import' ( ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) ) ) (otherlv_8= ';' )? )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2475:1: (otherlv_0= 'import' ( ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) ) ) (otherlv_8= ';' )? )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2475:3: otherlv_0= 'import' ( ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) ) ) (otherlv_8= ';' )?
+            // InternalGridSource.g:2483:2: (otherlv_0= 'import' ( ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) ) ) (otherlv_8= ';' )? )
+            // InternalGridSource.g:2484:3: otherlv_0= 'import' ( ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) ) ) (otherlv_8= ';' )?
             {
-            otherlv_0=(Token)match(input,64,FOLLOW_64_in_ruleXImportDeclaration5712); if (state.failed) return current;
+            otherlv_0=(Token)match(input,64,FOLLOW_51); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-                  	newLeafNode(otherlv_0, grammarAccess.getXImportDeclarationAccess().getImportKeyword_0());
-                  
+              			newLeafNode(otherlv_0, grammarAccess.getXImportDeclarationAccess().getImportKeyword_0());
+              		
             }
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2479:1: ( ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) ) )
+            // InternalGridSource.g:2488:3: ( ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) ) )
             int alt33=3;
             alt33 = dfa33.predict(input);
             switch (alt33) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2479:2: ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) )
+                    // InternalGridSource.g:2489:4: ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2479:2: ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2479:3: ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) )
+                    // InternalGridSource.g:2489:4: ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) )
+                    // InternalGridSource.g:2490:5: ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2479:3: ( (lv_static_1_0= 'static' ) )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2480:1: (lv_static_1_0= 'static' )
+                    // InternalGridSource.g:2490:5: ( (lv_static_1_0= 'static' ) )
+                    // InternalGridSource.g:2491:6: (lv_static_1_0= 'static' )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2480:1: (lv_static_1_0= 'static' )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2481:3: lv_static_1_0= 'static'
+                    // InternalGridSource.g:2491:6: (lv_static_1_0= 'static' )
+                    // InternalGridSource.g:2492:7: lv_static_1_0= 'static'
                     {
-                    lv_static_1_0=(Token)match(input,65,FOLLOW_65_in_ruleXImportDeclaration5732); if (state.failed) return current;
+                    lv_static_1_0=(Token)match(input,65,FOLLOW_52); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              newLeafNode(lv_static_1_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_1_0_0_0());
-                          
+                      							newLeafNode(lv_static_1_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_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");
+                      						
                     }
 
                     }
@@ -6902,7 +6999,7 @@
 
                     }
 
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2494:2: ( (lv_extension_2_0= 'extension' ) )?
+                    // InternalGridSource.g:2504:5: ( (lv_extension_2_0= 'extension' ) )?
                     int alt31=2;
                     int LA31_0 = input.LA(1);
 
@@ -6911,24 +7008,24 @@
                     }
                     switch (alt31) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2495:1: (lv_extension_2_0= 'extension' )
+                            // InternalGridSource.g:2505:6: (lv_extension_2_0= 'extension' )
                             {
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2495:1: (lv_extension_2_0= 'extension' )
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2496:3: lv_extension_2_0= 'extension'
+                            // InternalGridSource.g:2505:6: (lv_extension_2_0= 'extension' )
+                            // InternalGridSource.g:2506:7: lv_extension_2_0= 'extension'
                             {
-                            lv_extension_2_0=(Token)match(input,66,FOLLOW_66_in_ruleXImportDeclaration5763); if (state.failed) return current;
+                            lv_extension_2_0=(Token)match(input,66,FOLLOW_52); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                                      newLeafNode(lv_extension_2_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_1_0_1_0());
-                                  
+                              							newLeafNode(lv_extension_2_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_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");
+                              						
                             }
 
                             }
@@ -6939,33 +7036,33 @@
 
                     }
 
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2509:3: ( ( ruleQualifiedNameInStaticImport ) )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2510:1: ( ruleQualifiedNameInStaticImport )
+                    // InternalGridSource.g:2518:5: ( ( ruleQualifiedNameInStaticImport ) )
+                    // InternalGridSource.g:2519:6: ( ruleQualifiedNameInStaticImport )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2510:1: ( ruleQualifiedNameInStaticImport )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2511:3: ruleQualifiedNameInStaticImport
+                    // InternalGridSource.g:2519:6: ( ruleQualifiedNameInStaticImport )
+                    // InternalGridSource.g:2520:7: 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_1_0_2_0()); 
-                      	    
+
+                      							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_0_2_0());
+                      						
                     }
-                    pushFollow(FOLLOW_ruleQualifiedNameInStaticImport_in_ruleXImportDeclaration5800);
+                    pushFollow(FOLLOW_53);
                     ruleQualifiedNameInStaticImport();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                      	        afterParserOrEnumRuleCall();
-                      	    
+
+                      							afterParserOrEnumRuleCall();
+                      						
                     }
 
                     }
@@ -6973,7 +7070,7 @@
 
                     }
 
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2524:2: ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) )
+                    // InternalGridSource.g:2534:5: ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) )
                     int alt32=2;
                     int LA32_0 = input.LA(1);
 
@@ -6992,27 +7089,27 @@
                     }
                     switch (alt32) {
                         case 1 :
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2524:3: ( (lv_wildcard_4_0= '*' ) )
+                            // InternalGridSource.g:2535:6: ( (lv_wildcard_4_0= '*' ) )
                             {
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2524:3: ( (lv_wildcard_4_0= '*' ) )
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2525:1: (lv_wildcard_4_0= '*' )
+                            // InternalGridSource.g:2535:6: ( (lv_wildcard_4_0= '*' ) )
+                            // InternalGridSource.g:2536:7: (lv_wildcard_4_0= '*' )
                             {
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2525:1: (lv_wildcard_4_0= '*' )
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2526:3: lv_wildcard_4_0= '*'
+                            // InternalGridSource.g:2536:7: (lv_wildcard_4_0= '*' )
+                            // InternalGridSource.g:2537:8: lv_wildcard_4_0= '*'
                             {
-                            lv_wildcard_4_0=(Token)match(input,63,FOLLOW_63_in_ruleXImportDeclaration5819); if (state.failed) return current;
+                            lv_wildcard_4_0=(Token)match(input,63,FOLLOW_54); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
-                                      newLeafNode(lv_wildcard_4_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_1_0_3_0_0());
-                                  
+                              								newLeafNode(lv_wildcard_4_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_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, "*");
+                              							
                             }
 
                             }
@@ -7024,36 +7121,36 @@
                             }
                             break;
                         case 2 :
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2540:6: ( (lv_memberName_5_0= ruleValidID ) )
+                            // InternalGridSource.g:2550:6: ( (lv_memberName_5_0= ruleValidID ) )
                             {
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2540:6: ( (lv_memberName_5_0= ruleValidID ) )
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2541:1: (lv_memberName_5_0= ruleValidID )
+                            // InternalGridSource.g:2550:6: ( (lv_memberName_5_0= ruleValidID ) )
+                            // InternalGridSource.g:2551:7: (lv_memberName_5_0= ruleValidID )
                             {
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2541:1: (lv_memberName_5_0= ruleValidID )
-                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2542:3: lv_memberName_5_0= ruleValidID
+                            // InternalGridSource.g:2551:7: (lv_memberName_5_0= ruleValidID )
+                            // InternalGridSource.g:2552:8: lv_memberName_5_0= ruleValidID
                             {
                             if ( state.backtracking==0 ) {
-                               
-                              	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_1_0_3_1_0()); 
-                              	    
+
+                              								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_1_0_3_1_0());
+                              							
                             }
-                            pushFollow(FOLLOW_ruleValidID_in_ruleXImportDeclaration5859);
+                            pushFollow(FOLLOW_54);
                             lv_memberName_5_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_5_0, 
-                                      		"ValidID");
-                              	        afterParserOrEnumRuleCall();
-                              	    
+                              								if (current==null) {
+                              									current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
+                              								}
+                              								set(
+                              									current,
+                              									"memberName",
+                              									lv_memberName_5_0,
+                              									"org.eclipse.osbp.xtext.gridsource.GridSource.ValidID");
+                              								afterParserOrEnumRuleCall();
+                              							
                             }
 
                             }
@@ -7074,35 +7171,35 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2559:6: ( ( ruleQualifiedName ) )
+                    // InternalGridSource.g:2572:4: ( ( ruleQualifiedName ) )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2559:6: ( ( ruleQualifiedName ) )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2560:1: ( ruleQualifiedName )
+                    // InternalGridSource.g:2572:4: ( ( ruleQualifiedName ) )
+                    // InternalGridSource.g:2573:5: ( ruleQualifiedName )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2560:1: ( ruleQualifiedName )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2561:3: ruleQualifiedName
+                    // InternalGridSource.g:2573:5: ( ruleQualifiedName )
+                    // InternalGridSource.g:2574:6: 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_1_1_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_1_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleQualifiedName_in_ruleXImportDeclaration5890);
+                    pushFollow(FOLLOW_54);
                     ruleQualifiedName();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
-                       
-                      	        afterParserOrEnumRuleCall();
-                      	    
+
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -7114,36 +7211,36 @@
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2575:6: ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) )
+                    // InternalGridSource.g:2589:4: ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2575:6: ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2576:1: (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard )
+                    // InternalGridSource.g:2589:4: ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) )
+                    // InternalGridSource.g:2590:5: (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2576:1: (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2577:3: lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard
+                    // InternalGridSource.g:2590:5: (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard )
+                    // InternalGridSource.g:2591:6: lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard
                     {
                     if ( state.backtracking==0 ) {
-                       
-                      	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_2_0()); 
-                      	    
+
+                      						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_2_0());
+                      					
                     }
-                    pushFollow(FOLLOW_ruleQualifiedNameWithWildcard_in_ruleXImportDeclaration5917);
+                    pushFollow(FOLLOW_54);
                     lv_importedNamespace_7_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_7_0, 
-                              		"QualifiedNameWithWildcard");
-                      	        afterParserOrEnumRuleCall();
-                      	    
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getXImportDeclarationRule());
+                      						}
+                      						set(
+                      							current,
+                      							"importedNamespace",
+                      							lv_importedNamespace_7_0,
+                      							"org.eclipse.xtext.xbase.Xtype.QualifiedNameWithWildcard");
+                      						afterParserOrEnumRuleCall();
+                      					
                     }
 
                     }
@@ -7157,7 +7254,7 @@
 
             }
 
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2593:3: (otherlv_8= ';' )?
+            // InternalGridSource.g:2609:3: (otherlv_8= ';' )?
             int alt34=2;
             int LA34_0 = input.LA(1);
 
@@ -7166,13 +7263,13 @@
             }
             switch (alt34) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2593:5: otherlv_8= ';'
+                    // InternalGridSource.g:2610:4: otherlv_8= ';'
                     {
-                    otherlv_8=(Token)match(input,67,FOLLOW_67_in_ruleXImportDeclaration5931); if (state.failed) return current;
+                    otherlv_8=(Token)match(input,67,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                          	newLeafNode(otherlv_8, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_2());
-                          
+                      				newLeafNode(otherlv_8, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_2());
+                      			
                     }
 
                     }
@@ -7187,14 +7284,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7203,7 +7302,7 @@
 
 
     // $ANTLR start "entryRuleQualifiedNameInStaticImport"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2605:1: entryRuleQualifiedNameInStaticImport returns [String current=null] : iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF ;
+    // InternalGridSource.g:2619:1: entryRuleQualifiedNameInStaticImport returns [String current=null] : iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF ;
     public final String entryRuleQualifiedNameInStaticImport() throws RecognitionException {
         String current = null;
 
@@ -7211,13 +7310,13 @@
 
 
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2606:2: (iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2607:2: iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF
+            // InternalGridSource.g:2619:67: (iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF )
+            // InternalGridSource.g:2620:2: iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getQualifiedNameInStaticImportRule()); 
             }
-            pushFollow(FOLLOW_ruleQualifiedNameInStaticImport_in_entryRuleQualifiedNameInStaticImport5970);
+            pushFollow(FOLLOW_1);
             iv_ruleQualifiedNameInStaticImport=ruleQualifiedNameInStaticImport();
 
             state._fsp--;
@@ -7225,16 +7324,16 @@
             if ( state.backtracking==0 ) {
                current =iv_ruleQualifiedNameInStaticImport.getText(); 
             }
-            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedNameInStaticImport5981); if (state.failed) return current;
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
             }
 
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7243,7 +7342,7 @@
 
 
     // $ANTLR start "ruleQualifiedNameInStaticImport"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2614:1: ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID kw= '.' )+ ;
+    // InternalGridSource.g:2626:1: ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID kw= '.' )+ ;
     public final AntlrDatatypeRuleToken ruleQualifiedNameInStaticImport() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -7251,13 +7350,14 @@
         AntlrDatatypeRuleToken this_ValidID_0 = null;
 
 
-         enterRule(); 
-            
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2617:28: ( (this_ValidID_0= ruleValidID kw= '.' )+ )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2618:1: (this_ValidID_0= ruleValidID kw= '.' )+
+            // InternalGridSource.g:2632:2: ( (this_ValidID_0= ruleValidID kw= '.' )+ )
+            // InternalGridSource.g:2633:2: (this_ValidID_0= ruleValidID kw= '.' )+
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2618:1: (this_ValidID_0= ruleValidID kw= '.' )+
+            // InternalGridSource.g:2633:2: (this_ValidID_0= ruleValidID kw= '.' )+
             int cnt35=0;
             loop35:
             do {
@@ -7277,34 +7377,34 @@
 
                 switch (alt35) {
             	case 1 :
-            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2619:5: this_ValidID_0= ruleValidID kw= '.'
+            	    // InternalGridSource.g:2634:3: this_ValidID_0= ruleValidID kw= '.'
             	    {
             	    if ( state.backtracking==0 ) {
-            	       
-            	              newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0()); 
-            	          
+
+            	      			newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0());
+            	      		
             	    }
-            	    pushFollow(FOLLOW_ruleValidID_in_ruleQualifiedNameInStaticImport6028);
+            	    pushFollow(FOLLOW_49);
             	    this_ValidID_0=ruleValidID();
 
             	    state._fsp--;
             	    if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      		current.merge(this_ValidID_0);
-            	          
+            	      			current.merge(this_ValidID_0);
+            	      		
             	    }
             	    if ( state.backtracking==0 ) {
-            	       
-            	              afterParserOrEnumRuleCall();
-            	          
-            	    }
-            	    kw=(Token)match(input,26,FOLLOW_26_in_ruleQualifiedNameInStaticImport6046); if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
 
-            	              current.merge(kw);
-            	              newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1()); 
-            	          
+            	      			afterParserOrEnumRuleCall();
+            	      		
+            	    }
+            	    kw=(Token)match(input,26,FOLLOW_55); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      			current.merge(kw);
+            	      			newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1());
+            	      		
             	    }
 
             	    }
@@ -7324,14 +7424,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7340,7 +7442,7 @@
 
 
     // $ANTLR start "ruleStyleCompare"
-    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2643:1: ruleStyleCompare returns [Enumerator current=null] : ( (enumLiteral_0= 'equal' ) | (enumLiteral_1= 'greater equal' ) | (enumLiteral_2= 'greater than' ) | (enumLiteral_3= 'lower equal' ) | (enumLiteral_4= 'lower than' ) | (enumLiteral_5= 'not equal' ) ) ;
+    // InternalGridSource.g:2653:1: ruleStyleCompare returns [Enumerator current=null] : ( (enumLiteral_0= 'equal' ) | (enumLiteral_1= 'greater equal' ) | (enumLiteral_2= 'greater than' ) | (enumLiteral_3= 'lower equal' ) | (enumLiteral_4= 'lower than' ) | (enumLiteral_5= 'not equal' ) ) ;
     public final Enumerator ruleStyleCompare() throws RecognitionException {
         Enumerator current = null;
 
@@ -7351,12 +7453,14 @@
         Token enumLiteral_4=null;
         Token enumLiteral_5=null;
 
-         enterRule(); 
+
+        	enterRule();
+
         try {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2645:28: ( ( (enumLiteral_0= 'equal' ) | (enumLiteral_1= 'greater equal' ) | (enumLiteral_2= 'greater than' ) | (enumLiteral_3= 'lower equal' ) | (enumLiteral_4= 'lower than' ) | (enumLiteral_5= 'not equal' ) ) )
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2646:1: ( (enumLiteral_0= 'equal' ) | (enumLiteral_1= 'greater equal' ) | (enumLiteral_2= 'greater than' ) | (enumLiteral_3= 'lower equal' ) | (enumLiteral_4= 'lower than' ) | (enumLiteral_5= 'not equal' ) )
+            // InternalGridSource.g:2659:2: ( ( (enumLiteral_0= 'equal' ) | (enumLiteral_1= 'greater equal' ) | (enumLiteral_2= 'greater than' ) | (enumLiteral_3= 'lower equal' ) | (enumLiteral_4= 'lower than' ) | (enumLiteral_5= 'not equal' ) ) )
+            // InternalGridSource.g:2660:2: ( (enumLiteral_0= 'equal' ) | (enumLiteral_1= 'greater equal' ) | (enumLiteral_2= 'greater than' ) | (enumLiteral_3= 'lower equal' ) | (enumLiteral_4= 'lower than' ) | (enumLiteral_5= 'not equal' ) )
             {
-            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2646:1: ( (enumLiteral_0= 'equal' ) | (enumLiteral_1= 'greater equal' ) | (enumLiteral_2= 'greater than' ) | (enumLiteral_3= 'lower equal' ) | (enumLiteral_4= 'lower than' ) | (enumLiteral_5= 'not equal' ) )
+            // InternalGridSource.g:2660:2: ( (enumLiteral_0= 'equal' ) | (enumLiteral_1= 'greater equal' ) | (enumLiteral_2= 'greater than' ) | (enumLiteral_3= 'lower equal' ) | (enumLiteral_4= 'lower than' ) | (enumLiteral_5= 'not equal' ) )
             int alt36=6;
             switch ( input.LA(1) ) {
             case 68:
@@ -7399,17 +7503,17 @@
 
             switch (alt36) {
                 case 1 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2646:2: (enumLiteral_0= 'equal' )
+                    // InternalGridSource.g:2661:3: (enumLiteral_0= 'equal' )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2646:2: (enumLiteral_0= 'equal' )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2646:4: enumLiteral_0= 'equal'
+                    // InternalGridSource.g:2661:3: (enumLiteral_0= 'equal' )
+                    // InternalGridSource.g:2662:4: enumLiteral_0= 'equal'
                     {
-                    enumLiteral_0=(Token)match(input,68,FOLLOW_68_in_ruleStyleCompare6101); if (state.failed) return current;
+                    enumLiteral_0=(Token)match(input,68,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current = grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
-                              newLeafNode(enumLiteral_0, grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0()); 
-                          
+                      				current = grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0());
+                      			
                     }
 
                     }
@@ -7418,17 +7522,17 @@
                     }
                     break;
                 case 2 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2652:6: (enumLiteral_1= 'greater equal' )
+                    // InternalGridSource.g:2669:3: (enumLiteral_1= 'greater equal' )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2652:6: (enumLiteral_1= 'greater equal' )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2652:8: enumLiteral_1= 'greater equal'
+                    // InternalGridSource.g:2669:3: (enumLiteral_1= 'greater equal' )
+                    // InternalGridSource.g:2670:4: enumLiteral_1= 'greater equal'
                     {
-                    enumLiteral_1=(Token)match(input,69,FOLLOW_69_in_ruleStyleCompare6118); if (state.failed) return current;
+                    enumLiteral_1=(Token)match(input,69,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current = grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
-                              newLeafNode(enumLiteral_1, grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1()); 
-                          
+                      				current = grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1());
+                      			
                     }
 
                     }
@@ -7437,17 +7541,17 @@
                     }
                     break;
                 case 3 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2658:6: (enumLiteral_2= 'greater than' )
+                    // InternalGridSource.g:2677:3: (enumLiteral_2= 'greater than' )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2658:6: (enumLiteral_2= 'greater than' )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2658:8: enumLiteral_2= 'greater than'
+                    // InternalGridSource.g:2677:3: (enumLiteral_2= 'greater than' )
+                    // InternalGridSource.g:2678:4: enumLiteral_2= 'greater than'
                     {
-                    enumLiteral_2=(Token)match(input,70,FOLLOW_70_in_ruleStyleCompare6135); if (state.failed) return current;
+                    enumLiteral_2=(Token)match(input,70,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current = grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
-                              newLeafNode(enumLiteral_2, grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2()); 
-                          
+                      				current = grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2());
+                      			
                     }
 
                     }
@@ -7456,17 +7560,17 @@
                     }
                     break;
                 case 4 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2664:6: (enumLiteral_3= 'lower equal' )
+                    // InternalGridSource.g:2685:3: (enumLiteral_3= 'lower equal' )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2664:6: (enumLiteral_3= 'lower equal' )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2664:8: enumLiteral_3= 'lower equal'
+                    // InternalGridSource.g:2685:3: (enumLiteral_3= 'lower equal' )
+                    // InternalGridSource.g:2686:4: enumLiteral_3= 'lower equal'
                     {
-                    enumLiteral_3=(Token)match(input,71,FOLLOW_71_in_ruleStyleCompare6152); if (state.failed) return current;
+                    enumLiteral_3=(Token)match(input,71,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current = grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
-                              newLeafNode(enumLiteral_3, grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3()); 
-                          
+                      				current = grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3());
+                      			
                     }
 
                     }
@@ -7475,17 +7579,17 @@
                     }
                     break;
                 case 5 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2670:6: (enumLiteral_4= 'lower than' )
+                    // InternalGridSource.g:2693:3: (enumLiteral_4= 'lower than' )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2670:6: (enumLiteral_4= 'lower than' )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2670:8: enumLiteral_4= 'lower than'
+                    // InternalGridSource.g:2693:3: (enumLiteral_4= 'lower than' )
+                    // InternalGridSource.g:2694:4: enumLiteral_4= 'lower than'
                     {
-                    enumLiteral_4=(Token)match(input,72,FOLLOW_72_in_ruleStyleCompare6169); if (state.failed) return current;
+                    enumLiteral_4=(Token)match(input,72,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current = grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
-                              newLeafNode(enumLiteral_4, grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4()); 
-                          
+                      				current = grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_4, grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4());
+                      			
                     }
 
                     }
@@ -7494,17 +7598,17 @@
                     }
                     break;
                 case 6 :
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2676:6: (enumLiteral_5= 'not equal' )
+                    // InternalGridSource.g:2701:3: (enumLiteral_5= 'not equal' )
                     {
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2676:6: (enumLiteral_5= 'not equal' )
-                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2676:8: enumLiteral_5= 'not equal'
+                    // InternalGridSource.g:2701:3: (enumLiteral_5= 'not equal' )
+                    // InternalGridSource.g:2702:4: enumLiteral_5= 'not equal'
                     {
-                    enumLiteral_5=(Token)match(input,73,FOLLOW_73_in_ruleStyleCompare6186); if (state.failed) return current;
+                    enumLiteral_5=(Token)match(input,73,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                              current = grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
-                              newLeafNode(enumLiteral_5, grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5()); 
-                          
+                      				current = grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_5, grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5());
+                      			
                     }
 
                     }
@@ -7519,14 +7623,16 @@
             }
 
             if ( state.backtracking==0 ) {
-               leaveRule(); 
+
+              	leaveRule();
+
             }
         }
-         
-            catch (RecognitionException re) { 
-                recover(input,re); 
+
+            catch (RecognitionException re) {
+                recover(input,re);
                 appendSkippedTokens();
-            } 
+            }
         finally {
         }
         return current;
@@ -7535,10 +7641,10 @@
 
     // $ANTLR start synpred1_InternalGridSource
     public final void synpred1_InternalGridSource_fragment() throws RecognitionException {   
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1411:3: ( '.' )
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1412:2: '.'
+        // InternalGridSource.g:1407:5: ( '.' )
+        // InternalGridSource.g:1407:6: '.'
         {
-        match(input,26,FOLLOW_26_in_synpred1_InternalGridSource3124); if (state.failed) return ;
+        match(input,26,FOLLOW_2); if (state.failed) return ;
 
         }
     }
@@ -7546,18 +7652,18 @@
 
     // $ANTLR start synpred2_InternalGridSource
     public final void synpred2_InternalGridSource_fragment() throws RecognitionException {   
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1780:2: ( ( () ruleArrayBrackets ) )
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1780:3: ( () ruleArrayBrackets )
+        // InternalGridSource.g:1761:5: ( ( () ruleArrayBrackets ) )
+        // InternalGridSource.g:1761:6: ( () ruleArrayBrackets )
         {
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1780:3: ( () ruleArrayBrackets )
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1780:4: () ruleArrayBrackets
+        // InternalGridSource.g:1761:6: ( () ruleArrayBrackets )
+        // InternalGridSource.g:1762:6: () ruleArrayBrackets
         {
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1780:4: ()
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1781:1: 
+        // InternalGridSource.g:1762:6: ()
+        // InternalGridSource.g:1763:6: 
         {
         }
 
-        pushFollow(FOLLOW_ruleArrayBrackets_in_synpred2_InternalGridSource4081);
+        pushFollow(FOLLOW_2);
         ruleArrayBrackets();
 
         state._fsp--;
@@ -7572,10 +7678,10 @@
 
     // $ANTLR start synpred3_InternalGridSource
     public final void synpred3_InternalGridSource_fragment() throws RecognitionException {   
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1965:4: ( '<' )
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1965:6: '<'
+        // InternalGridSource.g:1958:5: ( '<' )
+        // InternalGridSource.g:1958:6: '<'
         {
-        match(input,57,FOLLOW_57_in_synpred3_InternalGridSource4533); if (state.failed) return ;
+        match(input,57,FOLLOW_2); if (state.failed) return ;
 
         }
     }
@@ -7583,18 +7689,18 @@
 
     // $ANTLR start synpred4_InternalGridSource
     public final void synpred4_InternalGridSource_fragment() throws RecognitionException {   
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2014:3: ( ( () '.' ) )
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2014:4: ( () '.' )
+        // InternalGridSource.g:2014:6: ( ( () '.' ) )
+        // InternalGridSource.g:2014:7: ( () '.' )
         {
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2014:4: ( () '.' )
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2014:5: () '.'
+        // InternalGridSource.g:2014:7: ( () '.' )
+        // InternalGridSource.g:2015:7: () '.'
         {
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2014:5: ()
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2015:1: 
+        // InternalGridSource.g:2015:7: ()
+        // InternalGridSource.g:2016:7: 
         {
         }
 
-        match(input,26,FOLLOW_26_in_synpred4_InternalGridSource4628); if (state.failed) return ;
+        match(input,26,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -7605,10 +7711,10 @@
 
     // $ANTLR start synpred5_InternalGridSource
     public final void synpred5_InternalGridSource_fragment() throws RecognitionException {   
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2041:4: ( '<' )
-        // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2041:6: '<'
+        // InternalGridSource.g:2052:7: ( '<' )
+        // InternalGridSource.g:2052:8: '<'
         {
-        match(input,57,FOLLOW_57_in_synpred5_InternalGridSource4685); if (state.failed) return ;
+        match(input,57,FOLLOW_2); if (state.failed) return ;
 
         }
     }
@@ -7689,19 +7795,13 @@
 
 
     protected DFA33 dfa33 = new DFA33(this);
-    static final String DFA33_eotS =
-        "\7\uffff";
-    static final String DFA33_eofS =
-        "\2\uffff\1\4\2\uffff\1\4\1\uffff";
-    static final String DFA33_minS =
-        "\1\4\1\uffff\1\32\1\4\1\uffff\1\32\1\uffff";
-    static final String DFA33_maxS =
-        "\1\101\1\uffff\1\103\1\77\1\uffff\1\103\1\uffff";
-    static final String DFA33_acceptS =
-        "\1\uffff\1\1\2\uffff\1\2\1\uffff\1\3";
-    static final String DFA33_specialS =
-        "\7\uffff}>";
-    static final String[] DFA33_transitionS = {
+    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\4\1\uffff\1\32\1\4\1\uffff\1\32\1\uffff";
+    static final String dfa_4s = "\1\101\1\uffff\1\103\1\77\1\uffff\1\103\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\74\uffff\1\1",
             "",
             "\1\3\50\uffff\1\4",
@@ -7711,295 +7811,87 @@
             ""
     };
 
-    static final short[] DFA33_eot = DFA.unpackEncodedString(DFA33_eotS);
-    static final short[] DFA33_eof = DFA.unpackEncodedString(DFA33_eofS);
-    static final char[] DFA33_min = DFA.unpackEncodedStringToUnsignedChars(DFA33_minS);
-    static final char[] DFA33_max = DFA.unpackEncodedStringToUnsignedChars(DFA33_maxS);
-    static final short[] DFA33_accept = DFA.unpackEncodedString(DFA33_acceptS);
-    static final short[] DFA33_special = DFA.unpackEncodedString(DFA33_specialS);
-    static final short[][] DFA33_transition;
-
-    static {
-        int numStates = DFA33_transitionS.length;
-        DFA33_transition = new short[numStates][];
-        for (int i=0; i<numStates; i++) {
-            DFA33_transition[i] = DFA.unpackEncodedString(DFA33_transitionS[i]);
-        }
-    }
+    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 DFA33 extends DFA {
 
         public DFA33(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
             this.decisionNumber = 33;
-            this.eot = DFA33_eot;
-            this.eof = DFA33_eof;
-            this.min = DFA33_min;
-            this.max = DFA33_max;
-            this.accept = DFA33_accept;
-            this.special = DFA33_special;
-            this.transition = DFA33_transition;
+            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 "2479:1: ( ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) ) )";
+            return "2488:3: ( ( ( (lv_static_1_0= 'static' ) ) ( (lv_extension_2_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_4_0= '*' ) ) | ( (lv_memberName_5_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_7_0= ruleQualifiedNameWithWildcard ) ) )";
         }
     }
  
 
-    public static final BitSet FOLLOW_ruleSource_in_entryRuleSource75 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleSource85 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_13_in_ruleSource122 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_ruleQualifiedName_in_ruleSource143 = new BitSet(new long[]{0x0000000000004000L});
-    public static final BitSet FOLLOW_14_in_ruleSource155 = new BitSet(new long[]{0x0100020000000010L});
-    public static final BitSet FOLLOW_ruleJvmTypeReference_in_ruleSource176 = new BitSet(new long[]{0x0000000000008000L});
-    public static final BitSet FOLLOW_15_in_ruleSource188 = new BitSet(new long[]{0x0000000000010000L});
-    public static final BitSet FOLLOW_16_in_ruleSource200 = new BitSet(new long[]{0x0000000000008000L});
-    public static final BitSet FOLLOW_15_in_ruleSource212 = new BitSet(new long[]{0x0000000000060000L});
-    public static final BitSet FOLLOW_ruleInput_in_ruleSource233 = new BitSet(new long[]{0x0000000000060000L});
-    public static final BitSet FOLLOW_17_in_ruleSource246 = new BitSet(new long[]{0x0000000001020000L});
-    public static final BitSet FOLLOW_ruleProperty_in_ruleSource267 = new BitSet(new long[]{0x0000000001020000L});
-    public static final BitSet FOLLOW_17_in_ruleSource280 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleInput_in_entryRuleInput316 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleInput326 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_18_in_ruleInput363 = new BitSet(new long[]{0x0100020000000010L});
-    public static final BitSet FOLLOW_ruleJvmTypeReference_in_ruleInput384 = new BitSet(new long[]{0x0000000000080000L});
-    public static final BitSet FOLLOW_19_in_ruleInput396 = new BitSet(new long[]{0x0000000000200000L});
-    public static final BitSet FOLLOW_ruleEQFilter_in_ruleInput417 = new BitSet(new long[]{0x0000000000100002L});
-    public static final BitSet FOLLOW_20_in_ruleInput430 = new BitSet(new long[]{0x0000000000200000L});
-    public static final BitSet FOLLOW_ruleEQFilter_in_ruleInput451 = new BitSet(new long[]{0x0000000000100002L});
-    public static final BitSet FOLLOW_ruleEQFilter_in_entryRuleEQFilter489 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleEQFilter499 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_21_in_ruleEQFilter545 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_ruleNestedField_in_ruleEQFilter566 = new BitSet(new long[]{0x0000000000400000L});
-    public static final BitSet FOLLOW_22_in_ruleEQFilter578 = new BitSet(new long[]{0x0000000000800000L});
-    public static final BitSet FOLLOW_23_in_ruleEQFilter590 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_ruleNestedField_in_ruleEQFilter611 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleProperty_in_entryRuleProperty647 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleProperty657 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_24_in_ruleProperty694 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_ruleNestedField_in_ruleProperty715 = new BitSet(new long[]{0x0000000002000000L});
-    public static final BitSet FOLLOW_25_in_ruleProperty727 = new BitSet(new long[]{0x0000D096E8000000L});
-    public static final BitSet FOLLOW_rulePropertyStyle_in_ruleProperty748 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleNestedField_in_entryRuleNestedField784 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleNestedField794 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_RULE_ID_in_ruleNestedField848 = new BitSet(new long[]{0x0000000004000002L});
-    public static final BitSet FOLLOW_ruleNestedPath_in_ruleNestedField869 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleNestedPath_in_entryRuleNestedPath906 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleNestedPath916 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_26_in_ruleNestedPath962 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_RULE_ID_in_ruleNestedPath982 = new BitSet(new long[]{0x0000000004000002L});
-    public static final BitSet FOLLOW_ruleNestedPath_in_ruleNestedPath1003 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyStyle_in_entryRulePropertyStyle1040 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRulePropertyStyle1050 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyButtonStyle_in_rulePropertyStyle1097 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyHtmlStyle_in_rulePropertyStyle1124 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyProgressbarStyle_in_rulePropertyStyle1151 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyTextStyle_in_rulePropertyStyle1178 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyBooleanStyle_in_rulePropertyStyle1205 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyDateStyle_in_rulePropertyStyle1232 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyNumberStyle_in_rulePropertyStyle1259 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyImageStyle_in_rulePropertyStyle1286 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyQuantityStyle_in_rulePropertyStyle1313 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyPriceStyle_in_rulePropertyStyle1340 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleGridPropIndicatorStyle_in_rulePropertyStyle1367 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyButtonStyle_in_entryRulePropertyButtonStyle1402 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRulePropertyButtonStyle1412 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_27_in_rulePropertyButtonStyle1458 = new BitSet(new long[]{0x0000000010000000L});
-    public static final BitSet FOLLOW_28_in_rulePropertyButtonStyle1470 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_RULE_STRING_in_rulePropertyButtonStyle1487 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyHtmlStyle_in_entryRulePropertyHtmlStyle1528 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRulePropertyHtmlStyle1538 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_29_in_rulePropertyHtmlStyle1584 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyBooleanStyle_in_entryRulePropertyBooleanStyle1620 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRulePropertyBooleanStyle1630 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_30_in_rulePropertyBooleanStyle1676 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyDateStyle_in_entryRulePropertyDateStyle1712 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRulePropertyDateStyle1722 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_31_in_rulePropertyDateStyle1768 = new BitSet(new long[]{0x0000000100000000L});
-    public static final BitSet FOLLOW_32_in_rulePropertyDateStyle1780 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_RULE_STRING_in_rulePropertyDateStyle1797 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyNumberStyle_in_entryRulePropertyNumberStyle1838 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRulePropertyNumberStyle1848 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_33_in_rulePropertyNumberStyle1894 = new BitSet(new long[]{0x0000000100000000L});
-    public static final BitSet FOLLOW_32_in_rulePropertyNumberStyle1906 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_RULE_STRING_in_rulePropertyNumberStyle1923 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyProgressbarStyle_in_entryRulePropertyProgressbarStyle1964 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRulePropertyProgressbarStyle1974 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_34_in_rulePropertyProgressbarStyle2020 = new BitSet(new long[]{0x0000000800000000L});
-    public static final BitSet FOLLOW_35_in_rulePropertyProgressbarStyle2032 = new BitSet(new long[]{0x0018000000000080L});
-    public static final BitSet FOLLOW_ruleLDouble_in_rulePropertyProgressbarStyle2053 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleGridPropIndicatorStyle_in_entryRuleGridPropIndicatorStyle2089 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleGridPropIndicatorStyle2099 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_36_in_ruleGridPropIndicatorStyle2145 = new BitSet(new long[]{0x0000002000000000L});
-    public static final BitSet FOLLOW_37_in_ruleGridPropIndicatorStyle2157 = new BitSet(new long[]{0x0018000000000080L});
-    public static final BitSet FOLLOW_ruleLDouble_in_ruleGridPropIndicatorStyle2178 = new BitSet(new long[]{0x0000004000000000L});
-    public static final BitSet FOLLOW_38_in_ruleGridPropIndicatorStyle2190 = new BitSet(new long[]{0x0018000000000080L});
-    public static final BitSet FOLLOW_ruleLDouble_in_ruleGridPropIndicatorStyle2211 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyQuantityStyle_in_entryRulePropertyQuantityStyle2247 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRulePropertyQuantityStyle2257 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_39_in_rulePropertyQuantityStyle2303 = new BitSet(new long[]{0x0000010000000020L});
-    public static final BitSet FOLLOW_RULE_STRING_in_rulePropertyQuantityStyle2320 = new BitSet(new long[]{0x0000010000000000L});
-    public static final BitSet FOLLOW_40_in_rulePropertyQuantityStyle2338 = new BitSet(new long[]{0x0000000000400000L});
-    public static final BitSet FOLLOW_22_in_rulePropertyQuantityStyle2350 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_ruleNestedField_in_rulePropertyQuantityStyle2371 = new BitSet(new long[]{0x00000A0000000000L});
-    public static final BitSet FOLLOW_41_in_rulePropertyQuantityStyle2384 = new BitSet(new long[]{0x0000000100000000L});
-    public static final BitSet FOLLOW_32_in_rulePropertyQuantityStyle2396 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_RULE_STRING_in_rulePropertyQuantityStyle2413 = new BitSet(new long[]{0x0000040000000000L});
-    public static final BitSet FOLLOW_42_in_rulePropertyQuantityStyle2430 = new BitSet(new long[]{0x0000080000000000L});
-    public static final BitSet FOLLOW_43_in_rulePropertyQuantityStyle2444 = new BitSet(new long[]{0x0000000000400000L});
-    public static final BitSet FOLLOW_22_in_rulePropertyQuantityStyle2456 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_ruleNestedField_in_rulePropertyQuantityStyle2477 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyPriceStyle_in_entryRulePropertyPriceStyle2513 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRulePropertyPriceStyle2523 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_44_in_rulePropertyPriceStyle2569 = new BitSet(new long[]{0x0000010000000020L});
-    public static final BitSet FOLLOW_RULE_STRING_in_rulePropertyPriceStyle2586 = new BitSet(new long[]{0x0000010000000000L});
-    public static final BitSet FOLLOW_40_in_rulePropertyPriceStyle2604 = new BitSet(new long[]{0x0000000000400000L});
-    public static final BitSet FOLLOW_22_in_rulePropertyPriceStyle2616 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_ruleNestedField_in_rulePropertyPriceStyle2637 = new BitSet(new long[]{0x0000220000000000L});
-    public static final BitSet FOLLOW_41_in_rulePropertyPriceStyle2650 = new BitSet(new long[]{0x0000000100000000L});
-    public static final BitSet FOLLOW_32_in_rulePropertyPriceStyle2662 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_RULE_STRING_in_rulePropertyPriceStyle2679 = new BitSet(new long[]{0x0000040000000000L});
-    public static final BitSet FOLLOW_42_in_rulePropertyPriceStyle2696 = new BitSet(new long[]{0x0000200000000000L});
-    public static final BitSet FOLLOW_45_in_rulePropertyPriceStyle2710 = new BitSet(new long[]{0x0000000000400000L});
-    public static final BitSet FOLLOW_22_in_rulePropertyPriceStyle2722 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_ruleNestedField_in_rulePropertyPriceStyle2743 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyTextStyle_in_entryRulePropertyTextStyle2779 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRulePropertyTextStyle2789 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_46_in_rulePropertyTextStyle2835 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_rulePropertyImageStyle_in_entryRulePropertyImageStyle2871 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRulePropertyImageStyle2881 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_47_in_rulePropertyImageStyle2927 = new BitSet(new long[]{0x0000000010008000L});
-    public static final BitSet FOLLOW_28_in_rulePropertyImageStyle2940 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_RULE_STRING_in_rulePropertyImageStyle2957 = new BitSet(new long[]{0x0000000000008000L});
-    public static final BitSet FOLLOW_15_in_rulePropertyImageStyle2976 = new BitSet(new long[]{0x0005000000020000L});
-    public static final BitSet FOLLOW_ruleStyleConfig_in_rulePropertyImageStyle2997 = new BitSet(new long[]{0x0005000000020000L});
-    public static final BitSet FOLLOW_17_in_rulePropertyImageStyle3010 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleQualifiedName_in_entryRuleQualifiedName3047 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleQualifiedName3058 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleValidID_in_ruleQualifiedName3105 = new BitSet(new long[]{0x0000000004000002L});
-    public static final BitSet FOLLOW_26_in_ruleQualifiedName3133 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_ruleValidID_in_ruleQualifiedName3156 = new BitSet(new long[]{0x0000000004000002L});
-    public static final BitSet FOLLOW_ruleValidID_in_entryRuleValidID3204 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleValidID3215 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_RULE_ID_in_ruleValidID3254 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleStyleConfig_in_entryRuleStyleConfig3298 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleStyleConfig3308 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleNumericToResourceStyleConfig_in_ruleStyleConfig3355 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleStringToResourceStyleConfig_in_ruleStyleConfig3382 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleNumericToResourceStyleConfig_in_entryRuleNumericToResourceStyleConfig3417 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleNumericToResourceStyleConfig3427 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_48_in_ruleNumericToResourceStyleConfig3464 = new BitSet(new long[]{0x0000000000000000L,0x00000000000003F0L});
-    public static final BitSet FOLLOW_ruleStyleCompare_in_ruleNumericToResourceStyleConfig3485 = new BitSet(new long[]{0x0018000000000080L});
-    public static final BitSet FOLLOW_ruleLDouble_in_ruleNumericToResourceStyleConfig3506 = new BitSet(new long[]{0x0002000000000000L});
-    public static final BitSet FOLLOW_49_in_ruleNumericToResourceStyleConfig3518 = new BitSet(new long[]{0x0000000000000040L});
-    public static final BitSet FOLLOW_RULE_THEME_RESOURCE_in_ruleNumericToResourceStyleConfig3535 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleStringToResourceStyleConfig_in_entryRuleStringToResourceStyleConfig3576 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleStringToResourceStyleConfig3586 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_50_in_ruleStringToResourceStyleConfig3623 = new BitSet(new long[]{0x0000000000000000L,0x00000000000003F0L});
-    public static final BitSet FOLLOW_ruleStyleCompare_in_ruleStringToResourceStyleConfig3644 = new BitSet(new long[]{0x0000000000000020L});
-    public static final BitSet FOLLOW_RULE_STRING_in_ruleStringToResourceStyleConfig3661 = new BitSet(new long[]{0x0002000000000000L});
-    public static final BitSet FOLLOW_49_in_ruleStringToResourceStyleConfig3678 = new BitSet(new long[]{0x0000000000000040L});
-    public static final BitSet FOLLOW_RULE_THEME_RESOURCE_in_ruleStringToResourceStyleConfig3695 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleLInt_in_entryRuleLInt3737 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleLInt3748 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_51_in_ruleLInt3787 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_52_in_ruleLInt3806 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_RULE_INT_in_ruleLInt3823 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleLDouble_in_entryRuleLDouble3869 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleLDouble3880 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleLInt_in_ruleLDouble3927 = new BitSet(new long[]{0x0000000004000002L});
-    public static final BitSet FOLLOW_26_in_ruleLDouble3946 = new BitSet(new long[]{0x0000000000000080L});
-    public static final BitSet FOLLOW_RULE_INT_in_ruleLDouble3961 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleJvmTypeReference_in_entryRuleJvmTypeReference4008 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleJvmTypeReference4018 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleJvmParameterizedTypeReference_in_ruleJvmTypeReference4066 = new BitSet(new long[]{0x0020000000000002L});
-    public static final BitSet FOLLOW_ruleArrayBrackets_in_ruleJvmTypeReference4102 = new BitSet(new long[]{0x0020000000000002L});
-    public static final BitSet FOLLOW_ruleXFunctionTypeRef_in_ruleJvmTypeReference4133 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleArrayBrackets_in_entryRuleArrayBrackets4169 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleArrayBrackets4180 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_53_in_ruleArrayBrackets4218 = new BitSet(new long[]{0x0040000000000000L});
-    public static final BitSet FOLLOW_54_in_ruleArrayBrackets4231 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleXFunctionTypeRef_in_entryRuleXFunctionTypeRef4271 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleXFunctionTypeRef4281 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_41_in_ruleXFunctionTypeRef4319 = new BitSet(new long[]{0x0100060000000010L});
-    public static final BitSet FOLLOW_ruleJvmTypeReference_in_ruleXFunctionTypeRef4341 = new BitSet(new long[]{0x0080040000000000L});
-    public static final BitSet FOLLOW_55_in_ruleXFunctionTypeRef4354 = new BitSet(new long[]{0x0100020000000010L});
-    public static final BitSet FOLLOW_ruleJvmTypeReference_in_ruleXFunctionTypeRef4375 = new BitSet(new long[]{0x0080040000000000L});
-    public static final BitSet FOLLOW_42_in_ruleXFunctionTypeRef4391 = new BitSet(new long[]{0x0100000000000000L});
-    public static final BitSet FOLLOW_56_in_ruleXFunctionTypeRef4405 = new BitSet(new long[]{0x0100020000000010L});
-    public static final BitSet FOLLOW_ruleJvmTypeReference_in_ruleXFunctionTypeRef4426 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleJvmParameterizedTypeReference_in_entryRuleJvmParameterizedTypeReference4462 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleJvmParameterizedTypeReference4472 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleQualifiedName_in_ruleJvmParameterizedTypeReference4520 = new BitSet(new long[]{0x0200000000000002L});
-    public static final BitSet FOLLOW_57_in_ruleJvmParameterizedTypeReference4541 = new BitSet(new long[]{0x0900020000000010L});
-    public static final BitSet FOLLOW_ruleJvmArgumentTypeReference_in_ruleJvmParameterizedTypeReference4563 = new BitSet(new long[]{0x0480000000000000L});
-    public static final BitSet FOLLOW_55_in_ruleJvmParameterizedTypeReference4576 = new BitSet(new long[]{0x0900020000000010L});
-    public static final BitSet FOLLOW_ruleJvmArgumentTypeReference_in_ruleJvmParameterizedTypeReference4597 = new BitSet(new long[]{0x0480000000000000L});
-    public static final BitSet FOLLOW_58_in_ruleJvmParameterizedTypeReference4611 = new BitSet(new long[]{0x0000000004000002L});
-    public static final BitSet FOLLOW_26_in_ruleJvmParameterizedTypeReference4647 = new BitSet(new long[]{0x0000000000000010L});
-    public static final BitSet FOLLOW_ruleValidID_in_ruleJvmParameterizedTypeReference4672 = new BitSet(new long[]{0x0200000004000002L});
-    public static final BitSet FOLLOW_57_in_ruleJvmParameterizedTypeReference4693 = new BitSet(new long[]{0x0900020000000010L});
-    public static final BitSet FOLLOW_ruleJvmArgumentTypeReference_in_ruleJvmParameterizedTypeReference4715 = new BitSet(new long[]{0x0480000000000000L});
-    public static final BitSet FOLLOW_55_in_ruleJvmParameterizedTypeReference4728 = new BitSet(new long[]{0x0900020000000010L});
-    public static final BitSet FOLLOW_ruleJvmArgumentTypeReference_in_ruleJvmParameterizedTypeReference4749 = new BitSet(new long[]{0x0480000000000000L});
-    public static final BitSet FOLLOW_58_in_ruleJvmParameterizedTypeReference4763 = new BitSet(new long[]{0x0000000004000002L});
-    public static final BitSet FOLLOW_ruleJvmArgumentTypeReference_in_entryRuleJvmArgumentTypeReference4805 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleJvmArgumentTypeReference4815 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleJvmTypeReference_in_ruleJvmArgumentTypeReference4862 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleJvmWildcardTypeReference_in_ruleJvmArgumentTypeReference4889 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleJvmWildcardTypeReference_in_entryRuleJvmWildcardTypeReference4924 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleJvmWildcardTypeReference4934 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_59_in_ruleJvmWildcardTypeReference4980 = new BitSet(new long[]{0x5000000000000002L});
-    public static final BitSet FOLLOW_ruleJvmUpperBound_in_ruleJvmWildcardTypeReference5003 = new BitSet(new long[]{0x2000000000000002L});
-    public static final BitSet FOLLOW_ruleJvmUpperBoundAnded_in_ruleJvmWildcardTypeReference5024 = new BitSet(new long[]{0x2000000000000002L});
-    public static final BitSet FOLLOW_ruleJvmLowerBound_in_ruleJvmWildcardTypeReference5054 = new BitSet(new long[]{0x2000000000000002L});
-    public static final BitSet FOLLOW_ruleJvmLowerBoundAnded_in_ruleJvmWildcardTypeReference5075 = new BitSet(new long[]{0x2000000000000002L});
-    public static final BitSet FOLLOW_ruleJvmUpperBound_in_entryRuleJvmUpperBound5115 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleJvmUpperBound5125 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_60_in_ruleJvmUpperBound5162 = new BitSet(new long[]{0x0100020000000010L});
-    public static final BitSet FOLLOW_ruleJvmTypeReference_in_ruleJvmUpperBound5183 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleJvmUpperBoundAnded_in_entryRuleJvmUpperBoundAnded5219 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleJvmUpperBoundAnded5229 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_61_in_ruleJvmUpperBoundAnded5266 = new BitSet(new long[]{0x0100020000000010L});
-    public static final BitSet FOLLOW_ruleJvmTypeReference_in_ruleJvmUpperBoundAnded5287 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleJvmLowerBound_in_entryRuleJvmLowerBound5323 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleJvmLowerBound5333 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_62_in_ruleJvmLowerBound5370 = new BitSet(new long[]{0x0100020000000010L});
-    public static final BitSet FOLLOW_ruleJvmTypeReference_in_ruleJvmLowerBound5391 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleJvmLowerBoundAnded_in_entryRuleJvmLowerBoundAnded5427 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleJvmLowerBoundAnded5437 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_61_in_ruleJvmLowerBoundAnded5474 = new BitSet(new long[]{0x0100020000000010L});
-    public static final BitSet FOLLOW_ruleJvmTypeReference_in_ruleJvmLowerBoundAnded5495 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleQualifiedNameWithWildcard_in_entryRuleQualifiedNameWithWildcard5534 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleQualifiedNameWithWildcard5545 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleQualifiedName_in_ruleQualifiedNameWithWildcard5592 = new BitSet(new long[]{0x0000000004000000L});
-    public static final BitSet FOLLOW_26_in_ruleQualifiedNameWithWildcard5610 = new BitSet(new long[]{0x8000000000000000L});
-    public static final BitSet FOLLOW_63_in_ruleQualifiedNameWithWildcard5623 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleXImportDeclaration_in_entryRuleXImportDeclaration5665 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleXImportDeclaration5675 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_64_in_ruleXImportDeclaration5712 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000002L});
-    public static final BitSet FOLLOW_65_in_ruleXImportDeclaration5732 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000004L});
-    public static final BitSet FOLLOW_66_in_ruleXImportDeclaration5763 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000004L});
-    public static final BitSet FOLLOW_ruleQualifiedNameInStaticImport_in_ruleXImportDeclaration5800 = new BitSet(new long[]{0x8000000000000010L});
-    public static final BitSet FOLLOW_63_in_ruleXImportDeclaration5819 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000008L});
-    public static final BitSet FOLLOW_ruleValidID_in_ruleXImportDeclaration5859 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000008L});
-    public static final BitSet FOLLOW_ruleQualifiedName_in_ruleXImportDeclaration5890 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000008L});
-    public static final BitSet FOLLOW_ruleQualifiedNameWithWildcard_in_ruleXImportDeclaration5917 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000008L});
-    public static final BitSet FOLLOW_67_in_ruleXImportDeclaration5931 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleQualifiedNameInStaticImport_in_entryRuleQualifiedNameInStaticImport5970 = new BitSet(new long[]{0x0000000000000000L});
-    public static final BitSet FOLLOW_EOF_in_entryRuleQualifiedNameInStaticImport5981 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleValidID_in_ruleQualifiedNameInStaticImport6028 = new BitSet(new long[]{0x0000000004000000L});
-    public static final BitSet FOLLOW_26_in_ruleQualifiedNameInStaticImport6046 = new BitSet(new long[]{0x0000000000000012L});
-    public static final BitSet FOLLOW_68_in_ruleStyleCompare6101 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_69_in_ruleStyleCompare6118 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_70_in_ruleStyleCompare6135 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_71_in_ruleStyleCompare6152 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_72_in_ruleStyleCompare6169 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_73_in_ruleStyleCompare6186 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_26_in_synpred1_InternalGridSource3124 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_ruleArrayBrackets_in_synpred2_InternalGridSource4081 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_57_in_synpred3_InternalGridSource4533 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_26_in_synpred4_InternalGridSource4628 = new BitSet(new long[]{0x0000000000000002L});
-    public static final BitSet FOLLOW_57_in_synpred5_InternalGridSource4685 = new BitSet(new long[]{0x0000000000000002L});
+    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[]{0x0000000000004000L});
+    public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0100020000000010L});
+    public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000008000L});
+    public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000010000L});
+    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000060000L});
+    public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000001020000L});
+    public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000080000L});
+    public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000200000L});
+    public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000100002L});
+    public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000400000L});
+    public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000000800000L});
+    public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000002000000L});
+    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000D096E8000000L});
+    public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000004000002L});
+    public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000010000000L});
+    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000000000020L});
+    public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000100000000L});
+    public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000000800000000L});
+    public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0018000000000080L});
+    public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000002000000000L});
+    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000004000000000L});
+    public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000010000000020L});
+    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000010000000000L});
+    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x00000A0000000000L});
+    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000040000000000L});
+    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000080000000000L});
+    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000220000000000L});
+    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000200000000000L});
+    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000010008000L});
+    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0005000000020000L});
+    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000000000000000L,0x00000000000003F0L});
+    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0002000000000000L});
+    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000000000000040L});
+    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0000000000000080L});
+    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0020000000000002L});
+    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0040000000000000L});
+    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0100060000000010L});
+    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0080040000000000L});
+    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0100000000000000L});
+    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0200000000000002L});
+    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0900020000000010L});
+    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0480000000000000L});
+    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0200000004000002L});
+    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x5000000000000002L});
+    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x2000000000000002L});
+    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0000000004000000L});
+    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x8000000000000000L});
+    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000002L});
+    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000004L});
+    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x8000000000000010L});
+    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000008L});
+    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000000000012L});
 
-}
+}
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/scoping/AbstractGridSourceScopeProvider.java b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/scoping/AbstractGridSourceScopeProvider.java
new file mode 100644
index 0000000..67c2cbd
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/scoping/AbstractGridSourceScopeProvider.java
@@ -0,0 +1,9 @@
+/*
+ * generated by Xtext 2.11.0
+ */
+package org.eclipse.osbp.xtext.gridsource.scoping;
+
+import org.eclipse.xtext.xbase.scoping.XtypeScopeProvider;
+
+public abstract class AbstractGridSourceScopeProvider extends XtypeScopeProvider {
+}
diff --git a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/serializer/GridSourceSemanticSequencer.java b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/serializer/GridSourceSemanticSequencer.java
index 7d0e36f..1004ce7 100644
--- a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/serializer/GridSourceSemanticSequencer.java
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/serializer/GridSourceSemanticSequencer.java
@@ -1,21 +1,12 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
+/*
+ * generated by Xtext 2.11.0
  */
 package org.eclipse.osbp.xtext.gridsource.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.infogrid.model.gridsource.CxGridNestedField;
 import org.eclipse.osbp.infogrid.model.gridsource.CxGridNestedPath;
 import org.eclipse.osbp.infogrid.model.gridsource.CxGridProperty;
@@ -38,6 +29,9 @@
 import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridStyleConfigStringToResource;
 import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridStylePackage;
 import org.eclipse.osbp.xtext.gridsource.services.GridSourceGrammarAccess;
+import org.eclipse.xtext.Action;
+import org.eclipse.xtext.Parameter;
+import org.eclipse.xtext.ParserRule;
 import org.eclipse.xtext.common.types.JvmGenericArrayTypeReference;
 import org.eclipse.xtext.common.types.JvmInnerTypeReference;
 import org.eclipse.xtext.common.types.JvmLowerBound;
@@ -46,14 +40,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.serializer.XtypeSemanticSequencer;
 import org.eclipse.xtext.xtype.XFunctionTypeRef;
@@ -67,239 +55,154 @@
 	@Inject
 	private GridSourceGrammarAccess grammarAccess;
 	
-	public void createSequence(EObject context, EObject semanticObject) {
-		if(semanticObject.eClass().getEPackage() == CxGridSourcePackage.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 == CxGridSourcePackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
 			case CxGridSourcePackage.CX_GRID_NESTED_FIELD:
-				if(context == grammarAccess.getNestedFieldRule()) {
-					sequence_NestedField(context, (CxGridNestedField) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_NestedField(context, (CxGridNestedField) semanticObject); 
+				return; 
 			case CxGridSourcePackage.CX_GRID_NESTED_PATH:
-				if(context == grammarAccess.getNestedPathRule()) {
-					sequence_NestedPath(context, (CxGridNestedPath) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_NestedPath(context, (CxGridNestedPath) semanticObject); 
+				return; 
 			case CxGridSourcePackage.CX_GRID_PROPERTY:
-				if(context == grammarAccess.getPropertyRule()) {
-					sequence_Property(context, (CxGridProperty) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_Property(context, (CxGridProperty) semanticObject); 
+				return; 
 			case CxGridSourcePackage.CX_GRID_SOURCE:
-				if(context == grammarAccess.getSourceRule()) {
-					sequence_Source(context, (CxGridSource) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_Source(context, (CxGridSource) semanticObject); 
+				return; 
 			case CxGridSourcePackage.CX_GRID_SOURCE_EQ_FILTER:
-				if(context == grammarAccess.getEQFilterRule()) {
-					sequence_EQFilter(context, (CxGridSourceEQFilter) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_EQFilter(context, (CxGridSourceEQFilter) semanticObject); 
+				return; 
 			case CxGridSourcePackage.CX_GRID_SOURCE_INPUT:
-				if(context == grammarAccess.getInputRule()) {
-					sequence_Input(context, (CxGridSourceInput) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_Input(context, (CxGridSourceInput) semanticObject); 
+				return; 
 			}
-		else if(semanticObject.eClass().getEPackage() == CxGridStylePackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+		else if (epackage == CxGridStylePackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
 			case CxGridStylePackage.CX_GRID_PROP_BOOLEAN_STYLE:
-				if(context == grammarAccess.getPropertyBooleanStyleRule() ||
-				   context == grammarAccess.getPropertyStyleRule()) {
-					sequence_PropertyBooleanStyle(context, (CxGridPropBooleanStyle) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyBooleanStyle(context, (CxGridPropBooleanStyle) semanticObject); 
+				return; 
 			case CxGridStylePackage.CX_GRID_PROP_BUTTON_STYLE:
-				if(context == grammarAccess.getPropertyButtonStyleRule() ||
-				   context == grammarAccess.getPropertyStyleRule()) {
-					sequence_PropertyButtonStyle(context, (CxGridPropButtonStyle) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyButtonStyle(context, (CxGridPropButtonStyle) semanticObject); 
+				return; 
 			case CxGridStylePackage.CX_GRID_PROP_DATE_STYLE:
-				if(context == grammarAccess.getPropertyDateStyleRule() ||
-				   context == grammarAccess.getPropertyStyleRule()) {
-					sequence_PropertyDateStyle(context, (CxGridPropDateStyle) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyDateStyle(context, (CxGridPropDateStyle) semanticObject); 
+				return; 
 			case CxGridStylePackage.CX_GRID_PROP_HTML_STYLE:
-				if(context == grammarAccess.getPropertyHtmlStyleRule() ||
-				   context == grammarAccess.getPropertyStyleRule()) {
-					sequence_PropertyHtmlStyle(context, (CxGridPropHtmlStyle) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyHtmlStyle(context, (CxGridPropHtmlStyle) semanticObject); 
+				return; 
 			case CxGridStylePackage.CX_GRID_PROP_IMAGE_STYLE:
-				if(context == grammarAccess.getPropertyImageStyleRule() ||
-				   context == grammarAccess.getPropertyStyleRule()) {
-					sequence_PropertyImageStyle(context, (CxGridPropImageStyle) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyImageStyle(context, (CxGridPropImageStyle) semanticObject); 
+				return; 
 			case CxGridStylePackage.CX_GRID_PROP_INDICATOR_STYLE:
-				if(context == grammarAccess.getGridPropIndicatorStyleRule() ||
-				   context == grammarAccess.getPropertyStyleRule()) {
-					sequence_GridPropIndicatorStyle(context, (CxGridPropIndicatorStyle) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_GridPropIndicatorStyle(context, (CxGridPropIndicatorStyle) semanticObject); 
+				return; 
 			case CxGridStylePackage.CX_GRID_PROP_NUMBER_STYLE:
-				if(context == grammarAccess.getPropertyNumberStyleRule() ||
-				   context == grammarAccess.getPropertyStyleRule()) {
-					sequence_PropertyNumberStyle(context, (CxGridPropNumberStyle) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyNumberStyle(context, (CxGridPropNumberStyle) semanticObject); 
+				return; 
 			case CxGridStylePackage.CX_GRID_PROP_PRICE_STYLE:
-				if(context == grammarAccess.getPropertyPriceStyleRule() ||
-				   context == grammarAccess.getPropertyStyleRule()) {
-					sequence_PropertyPriceStyle(context, (CxGridPropPriceStyle) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyPriceStyle(context, (CxGridPropPriceStyle) semanticObject); 
+				return; 
 			case CxGridStylePackage.CX_GRID_PROP_PROGRESSBAR_STYLE:
-				if(context == grammarAccess.getPropertyProgressbarStyleRule() ||
-				   context == grammarAccess.getPropertyStyleRule()) {
-					sequence_PropertyProgressbarStyle(context, (CxGridPropProgressbarStyle) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyProgressbarStyle(context, (CxGridPropProgressbarStyle) semanticObject); 
+				return; 
 			case CxGridStylePackage.CX_GRID_PROP_QUANTITY_STYLE:
-				if(context == grammarAccess.getPropertyQuantityStyleRule() ||
-				   context == grammarAccess.getPropertyStyleRule()) {
-					sequence_PropertyQuantityStyle(context, (CxGridPropQuantityStyle) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyQuantityStyle(context, (CxGridPropQuantityStyle) semanticObject); 
+				return; 
 			case CxGridStylePackage.CX_GRID_PROP_TEXT_STYLE:
-				if(context == grammarAccess.getPropertyStyleRule() ||
-				   context == grammarAccess.getPropertyTextStyleRule()) {
-					sequence_PropertyTextStyle(context, (CxGridPropTextStyle) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_PropertyTextStyle(context, (CxGridPropTextStyle) semanticObject); 
+				return; 
 			case CxGridStylePackage.CX_GRID_STYLE_CONFIG_NUMERIC_TO_RESOURCE:
-				if(context == grammarAccess.getNumericToResourceStyleConfigRule() ||
-				   context == grammarAccess.getStyleConfigRule()) {
-					sequence_NumericToResourceStyleConfig(context, (CxGridStyleConfigNumericToResource) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_NumericToResourceStyleConfig(context, (CxGridStyleConfigNumericToResource) semanticObject); 
+				return; 
 			case CxGridStylePackage.CX_GRID_STYLE_CONFIG_STRING_TO_RESOURCE:
-				if(context == grammarAccess.getStringToResourceStyleConfigRule() ||
-				   context == grammarAccess.getStyleConfigRule()) {
-					sequence_StringToResourceStyleConfig(context, (CxGridStyleConfigStringToResource) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_StringToResourceStyleConfig(context, (CxGridStyleConfigStringToResource) semanticObject); 
+				return; 
 			}
-		else if(semanticObject.eClass().getEPackage() == TypesPackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+		else if (epackage == TypesPackage.eINSTANCE)
+			switch (semanticObject.eClass().getClassifierID()) {
 			case TypesPackage.JVM_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() == 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_DECLARATION:
-				if(context == grammarAccess.getXImportDeclarationRule()) {
-					sequence_XImportDeclaration(context, (XImportDeclaration) semanticObject); 
-					return; 
-				}
-				else break;
+				sequence_XImportDeclaration(context, (XImportDeclaration) 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:
+	 *     EQFilter returns CxGridSourceEQFilter
+	 *
 	 * Constraint:
 	 *     (rootTypePropertyPath=NestedField inputTypePropertyPath=NestedField)
 	 */
-	protected void sequence_EQFilter(EObject context, CxGridSourceEQFilter semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, CxGridSourcePackage.Literals.CX_GRID_SOURCE_EQ_FILTER__INPUT_TYPE_PROPERTY_PATH) == ValueTransient.YES)
-				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridSourcePackage.Literals.CX_GRID_SOURCE_EQ_FILTER__INPUT_TYPE_PROPERTY_PATH));
-			if(transientValues.isValueTransient(semanticObject, CxGridSourcePackage.Literals.CX_GRID_SOURCE_EQ_FILTER__ROOT_TYPE_PROPERTY_PATH) == ValueTransient.YES)
+	protected void sequence_EQFilter(ISerializationContext context, CxGridSourceEQFilter semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, CxGridSourcePackage.Literals.CX_GRID_SOURCE_EQ_FILTER__ROOT_TYPE_PROPERTY_PATH) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridSourcePackage.Literals.CX_GRID_SOURCE_EQ_FILTER__ROOT_TYPE_PROPERTY_PATH));
+			if (transientValues.isValueTransient(semanticObject, CxGridSourcePackage.Literals.CX_GRID_SOURCE_EQ_FILTER__INPUT_TYPE_PROPERTY_PATH) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridSourcePackage.Literals.CX_GRID_SOURCE_EQ_FILTER__INPUT_TYPE_PROPERTY_PATH));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getEQFilterAccess().getRootTypePropertyPathNestedFieldParserRuleCall_2_0(), semanticObject.getRootTypePropertyPath());
 		feeder.accept(grammarAccess.getEQFilterAccess().getInputTypePropertyPathNestedFieldParserRuleCall_5_0(), semanticObject.getInputTypePropertyPath());
 		feeder.finish();
@@ -307,56 +210,81 @@
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyStyle returns CxGridPropIndicatorStyle
+	 *     GridPropIndicatorStyle returns CxGridPropIndicatorStyle
+	 *
 	 * Constraint:
 	 *     (greenStarts=LDouble redEnds=LDouble)
 	 */
-	protected void sequence_GridPropIndicatorStyle(EObject context, CxGridPropIndicatorStyle semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_GridPropIndicatorStyle(ISerializationContext context, CxGridPropIndicatorStyle semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_INDICATOR_STYLE__GREEN_STARTS) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_INDICATOR_STYLE__GREEN_STARTS));
+			if (transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_INDICATOR_STYLE__RED_ENDS) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_INDICATOR_STYLE__RED_ENDS));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsLDoubleParserRuleCall_3_0(), semanticObject.getGreenStarts());
+		feeder.accept(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsLDoubleParserRuleCall_5_0(), semanticObject.getRedEnds());
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     Input returns CxGridSourceInput
+	 *
 	 * Constraint:
 	 *     (inputType=JvmTypeReference filters+=EQFilter filters+=EQFilter*)
 	 */
-	protected void sequence_Input(EObject context, CxGridSourceInput semanticObject) {
+	protected void sequence_Input(ISerializationContext context, CxGridSourceInput semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     NestedField returns CxGridNestedField
+	 *
 	 * Constraint:
 	 *     (field=[JvmOperation|ID] path=NestedPath?)
 	 */
-	protected void sequence_NestedField(EObject context, CxGridNestedField semanticObject) {
+	protected void sequence_NestedField(ISerializationContext context, CxGridNestedField semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     NestedPath returns CxGridNestedPath
+	 *
 	 * Constraint:
 	 *     (field=[JvmOperation|ID] path=NestedPath?)
 	 */
-	protected void sequence_NestedPath(EObject context, CxGridNestedPath semanticObject) {
+	protected void sequence_NestedPath(ISerializationContext context, CxGridNestedPath semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     StyleConfig returns CxGridStyleConfigNumericToResource
+	 *     NumericToResourceStyleConfig returns CxGridStyleConfigNumericToResource
+	 *
 	 * Constraint:
 	 *     (compare=StyleCompare value=LDouble resourceThemePath=THEME_RESOURCE)
 	 */
-	protected void sequence_NumericToResourceStyleConfig(EObject context, CxGridStyleConfigNumericToResource semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_NUMERIC_TO_RESOURCE__VALUE) == ValueTransient.YES)
-				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_NUMERIC_TO_RESOURCE__VALUE));
-			if(transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_NUMERIC_TO_RESOURCE__COMPARE) == ValueTransient.YES)
+	protected void sequence_NumericToResourceStyleConfig(ISerializationContext context, CxGridStyleConfigNumericToResource semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_NUMERIC_TO_RESOURCE__COMPARE) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_NUMERIC_TO_RESOURCE__COMPARE));
-			if(transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_NUMERIC_TO_RESOURCE__RESOURCE_THEME_PATH) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_NUMERIC_TO_RESOURCE__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_NUMERIC_TO_RESOURCE__VALUE));
+			if (transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_NUMERIC_TO_RESOURCE__RESOURCE_THEME_PATH) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_NUMERIC_TO_RESOURCE__RESOURCE_THEME_PATH));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0(), semanticObject.getCompare());
 		feeder.accept(grammarAccess.getNumericToResourceStyleConfigAccess().getValueLDoubleParserRuleCall_2_0(), semanticObject.getValue());
 		feeder.accept(grammarAccess.getNumericToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0(), semanticObject.getResourceThemePath());
@@ -365,159 +293,215 @@
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyStyle returns CxGridPropBooleanStyle
+	 *     PropertyBooleanStyle returns CxGridPropBooleanStyle
+	 *
 	 * Constraint:
 	 *     {CxGridPropBooleanStyle}
 	 */
-	protected void sequence_PropertyBooleanStyle(EObject context, CxGridPropBooleanStyle semanticObject) {
+	protected void sequence_PropertyBooleanStyle(ISerializationContext context, CxGridPropBooleanStyle semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyStyle returns CxGridPropButtonStyle
+	 *     PropertyButtonStyle returns CxGridPropButtonStyle
+	 *
 	 * Constraint:
 	 *     eventTopic=STRING
 	 */
-	protected void sequence_PropertyButtonStyle(EObject context, CxGridPropButtonStyle semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_EVENT_TOPIC_ABLE__EVENT_TOPIC) == ValueTransient.YES)
+	protected void sequence_PropertyButtonStyle(ISerializationContext context, CxGridPropButtonStyle semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_EVENT_TOPIC_ABLE__EVENT_TOPIC) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_EVENT_TOPIC_ABLE__EVENT_TOPIC));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getPropertyButtonStyleAccess().getEventTopicSTRINGTerminalRuleCall_3_0(), semanticObject.getEventTopic());
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyStyle returns CxGridPropDateStyle
+	 *     PropertyDateStyle returns CxGridPropDateStyle
+	 *
 	 * Constraint:
 	 *     dateFormat=STRING
 	 */
-	protected void sequence_PropertyDateStyle(EObject context, CxGridPropDateStyle semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_DATE_STYLE__DATE_FORMAT) == ValueTransient.YES)
+	protected void sequence_PropertyDateStyle(ISerializationContext context, CxGridPropDateStyle semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_DATE_STYLE__DATE_FORMAT) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_DATE_STYLE__DATE_FORMAT));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getPropertyDateStyleAccess().getDateFormatSTRINGTerminalRuleCall_3_0(), semanticObject.getDateFormat());
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyStyle returns CxGridPropHtmlStyle
+	 *     PropertyHtmlStyle returns CxGridPropHtmlStyle
+	 *
 	 * Constraint:
 	 *     {CxGridPropHtmlStyle}
 	 */
-	protected void sequence_PropertyHtmlStyle(EObject context, CxGridPropHtmlStyle semanticObject) {
+	protected void sequence_PropertyHtmlStyle(ISerializationContext context, CxGridPropHtmlStyle semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyStyle returns CxGridPropImageStyle
+	 *     PropertyImageStyle returns CxGridPropImageStyle
+	 *
 	 * Constraint:
 	 *     (eventTopic=STRING? configs+=StyleConfig*)
 	 */
-	protected void sequence_PropertyImageStyle(EObject context, CxGridPropImageStyle semanticObject) {
+	protected void sequence_PropertyImageStyle(ISerializationContext context, CxGridPropImageStyle semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyStyle returns CxGridPropNumberStyle
+	 *     PropertyNumberStyle returns CxGridPropNumberStyle
+	 *
 	 * Constraint:
 	 *     numberFormat=STRING
 	 */
-	protected void sequence_PropertyNumberStyle(EObject context, CxGridPropNumberStyle semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_NUMBER_STYLE__NUMBER_FORMAT) == ValueTransient.YES)
+	protected void sequence_PropertyNumberStyle(ISerializationContext context, CxGridPropNumberStyle semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_NUMBER_STYLE__NUMBER_FORMAT) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_NUMBER_STYLE__NUMBER_FORMAT));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatSTRINGTerminalRuleCall_3_0(), semanticObject.getNumberFormat());
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyStyle returns CxGridPropPriceStyle
+	 *     PropertyPriceStyle returns CxGridPropPriceStyle
+	 *
 	 * Constraint:
 	 *     (htmlPattern=STRING? valuePropertyPath=NestedField valueNumberFormat=STRING? currencyPropertyPath=NestedField)
 	 */
-	protected void sequence_PropertyPriceStyle(EObject context, CxGridPropPriceStyle semanticObject) {
+	protected void sequence_PropertyPriceStyle(ISerializationContext context, CxGridPropPriceStyle semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyStyle returns CxGridPropProgressbarStyle
+	 *     PropertyProgressbarStyle returns CxGridPropProgressbarStyle
+	 *
 	 * Constraint:
 	 *     maxValue=LDouble
 	 */
-	protected void sequence_PropertyProgressbarStyle(EObject context, CxGridPropProgressbarStyle semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_PROGRESSBAR_STYLE__MAX_VALUE) == ValueTransient.YES)
+	protected void sequence_PropertyProgressbarStyle(ISerializationContext context, CxGridPropProgressbarStyle semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_PROGRESSBAR_STYLE__MAX_VALUE) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_PROGRESSBAR_STYLE__MAX_VALUE));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueLDoubleParserRuleCall_3_0(), semanticObject.getMaxValue());
 		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyStyle returns CxGridPropQuantityStyle
+	 *     PropertyQuantityStyle returns CxGridPropQuantityStyle
+	 *
 	 * Constraint:
 	 *     (htmlPattern=STRING? valuePropertyPath=NestedField valueNumberFormat=STRING? uomPropertyPath=NestedField)
 	 */
-	protected void sequence_PropertyQuantityStyle(EObject context, CxGridPropQuantityStyle semanticObject) {
+	protected void sequence_PropertyQuantityStyle(ISerializationContext context, CxGridPropQuantityStyle semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     PropertyStyle returns CxGridPropTextStyle
+	 *     PropertyTextStyle returns CxGridPropTextStyle
+	 *
 	 * Constraint:
 	 *     {CxGridPropTextStyle}
 	 */
-	protected void sequence_PropertyTextStyle(EObject context, CxGridPropTextStyle semanticObject) {
+	protected void sequence_PropertyTextStyle(ISerializationContext context, CxGridPropTextStyle semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     Property returns CxGridProperty
+	 *
 	 * Constraint:
 	 *     (path=NestedField style=PropertyStyle)
 	 */
-	protected void sequence_Property(EObject context, CxGridProperty semanticObject) {
-		genericSequencer.createSequence(context, semanticObject);
+	protected void sequence_Property(ISerializationContext context, CxGridProperty semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, CxGridSourcePackage.Literals.CX_GRID_PROPERTY__PATH) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridSourcePackage.Literals.CX_GRID_PROPERTY__PATH));
+			if (transientValues.isValueTransient(semanticObject, CxGridSourcePackage.Literals.CX_GRID_PROPERTY__STYLE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridSourcePackage.Literals.CX_GRID_PROPERTY__STYLE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getPropertyAccess().getPathNestedFieldParserRuleCall_1_0(), semanticObject.getPath());
+		feeder.accept(grammarAccess.getPropertyAccess().getStylePropertyStyleParserRuleCall_3_0(), semanticObject.getStyle());
+		feeder.finish();
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     Source returns CxGridSource
+	 *
 	 * Constraint:
 	 *     (id=QualifiedName rootType=JvmTypeReference inputs+=Input* properties+=Property*)
 	 */
-	protected void sequence_Source(EObject context, CxGridSource semanticObject) {
+	protected void sequence_Source(ISerializationContext context, CxGridSource semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
 	
 	/**
+	 * Contexts:
+	 *     StyleConfig returns CxGridStyleConfigStringToResource
+	 *     StringToResourceStyleConfig returns CxGridStyleConfigStringToResource
+	 *
 	 * Constraint:
 	 *     (compare=StyleCompare value=STRING resourceThemePath=THEME_RESOURCE)
 	 */
-	protected void sequence_StringToResourceStyleConfig(EObject context, CxGridStyleConfigStringToResource semanticObject) {
-		if(errorAcceptor != null) {
-			if(transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_STRING_TO_RESOURCE__VALUE) == ValueTransient.YES)
-				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_STRING_TO_RESOURCE__VALUE));
-			if(transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_STRING_TO_RESOURCE__COMPARE) == ValueTransient.YES)
+	protected void sequence_StringToResourceStyleConfig(ISerializationContext context, CxGridStyleConfigStringToResource semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_STRING_TO_RESOURCE__COMPARE) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_STRING_TO_RESOURCE__COMPARE));
-			if(transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_STRING_TO_RESOURCE__RESOURCE_THEME_PATH) == ValueTransient.YES)
+			if (transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_STRING_TO_RESOURCE__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_STRING_TO_RESOURCE__VALUE));
+			if (transientValues.isValueTransient(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_STRING_TO_RESOURCE__RESOURCE_THEME_PATH) == ValueTransient.YES)
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_STYLE_CONFIG_STRING_TO_RESOURCE__RESOURCE_THEME_PATH));
 		}
-		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
-		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
 		feeder.accept(grammarAccess.getStringToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0(), semanticObject.getCompare());
 		feeder.accept(grammarAccess.getStringToResourceStyleConfigAccess().getValueSTRINGTerminalRuleCall_2_0(), semanticObject.getValue());
 		feeder.accept(grammarAccess.getStringToResourceStyleConfigAccess().getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0(), semanticObject.getResourceThemePath());
 		feeder.finish();
 	}
+	
+	
 }
diff --git a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/serializer/GridSourceSyntacticSequencer.java b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/serializer/GridSourceSyntacticSequencer.java
index 10bc755..304cda8 100644
--- a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/serializer/GridSourceSyntacticSequencer.java
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/serializer/GridSourceSyntacticSequencer.java
@@ -1,15 +1,5 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
+/*
+ * generated by Xtext 2.11.0
  */
 package org.eclipse.osbp.xtext.gridsource.serializer;
 
@@ -43,7 +33,7 @@
 	
 	@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);
 		return "";
 	}
@@ -65,25 +55,34 @@
 		List<INode> transitionNodes = collectNodes(fromNode, toNode);
 		for (AbstractElementAlias syntax : transition.getAmbiguousSyntaxes()) {
 			List<INode> syntaxNodes = getNodesFor(transitionNodes, syntax);
-			if(match_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q.equals(syntax))
+			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))
+			else if (match_XImportDeclaration_SemicolonKeyword_2_q.equals(syntax))
 				emit_XImportDeclaration_SemicolonKeyword_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
 			else acceptNodes(getLastNavigableState(), syntaxNodes);
 		}
 	}
 
 	/**
-	 * 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:
+	 *     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) {
 		acceptNodes(transition, nodes);
diff --git a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/services/GridSourceGrammarAccess.java b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/services/GridSourceGrammarAccess.java
index 4b34d4f..77070d6 100644
--- a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/services/GridSourceGrammarAccess.java
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/services/GridSourceGrammarAccess.java
@@ -1,35 +1,34 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
+/*
+ * generated by Xtext 2.11.0
  */
 package org.eclipse.osbp.xtext.gridsource.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.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.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.services.XtypeGrammarAccess;
 
 @Singleton
 public class GridSourceGrammarAccess extends AbstractGrammarElementFinder {
 	
-	
 	public class SourceElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "Source");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.Source");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cGridsourceKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cIdAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -47,63 +46,66 @@
 		private final RuleCall cPropertiesPropertyParserRuleCall_9_0 = (RuleCall)cPropertiesAssignment_9.eContents().get(0);
 		private final Keyword cRightCurlyBracketKeyword_10 = (Keyword)cGroup.eContents().get(10);
 		
-		//Source returns CxGridSource:
-		//	"gridsource" id=QualifiedName "for" rootType=JvmTypeReference "{" "inputs" "{" inputs+=Input* "}"
-		//	properties+=Property* "}";
-		public ParserRule getRule() { return rule; }
-
-		//"gridsource" id=QualifiedName "for" rootType=JvmTypeReference "{" "inputs" "{" inputs+=Input* "}" properties+=Property*
-		//"}"
+		//Source CxGridSource:
+		//	'gridsource' id=QualifiedName 'for' rootType=JvmTypeReference '{'
+		//	'inputs' '{'
+		//	inputs+=Input*
+		//	'}'
+		//	properties+=Property*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'gridsource' id=QualifiedName 'for' rootType=JvmTypeReference '{' 'inputs' '{' inputs+=Input* '}' properties+=Property*
+		//'}'
 		public Group getGroup() { return cGroup; }
-
-		//"gridsource"
+		
+		//'gridsource'
 		public Keyword getGridsourceKeyword_0() { return cGridsourceKeyword_0; }
-
+		
 		//id=QualifiedName
 		public Assignment getIdAssignment_1() { return cIdAssignment_1; }
-
+		
 		//QualifiedName
 		public RuleCall getIdQualifiedNameParserRuleCall_1_0() { return cIdQualifiedNameParserRuleCall_1_0; }
-
-		//"for"
+		
+		//'for'
 		public Keyword getForKeyword_2() { return cForKeyword_2; }
-
+		
 		//rootType=JvmTypeReference
 		public Assignment getRootTypeAssignment_3() { return cRootTypeAssignment_3; }
-
+		
 		//JvmTypeReference
 		public RuleCall getRootTypeJvmTypeReferenceParserRuleCall_3_0() { return cRootTypeJvmTypeReferenceParserRuleCall_3_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_4() { return cLeftCurlyBracketKeyword_4; }
-
-		//"inputs"
+		
+		//'inputs'
 		public Keyword getInputsKeyword_5() { return cInputsKeyword_5; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_6() { return cLeftCurlyBracketKeyword_6; }
-
+		
 		//inputs+=Input*
 		public Assignment getInputsAssignment_7() { return cInputsAssignment_7; }
-
+		
 		//Input
 		public RuleCall getInputsInputParserRuleCall_7_0() { return cInputsInputParserRuleCall_7_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_8() { return cRightCurlyBracketKeyword_8; }
-
+		
 		//properties+=Property*
 		public Assignment getPropertiesAssignment_9() { return cPropertiesAssignment_9; }
-
+		
 		//Property
 		public RuleCall getPropertiesPropertyParserRuleCall_9_0() { return cPropertiesPropertyParserRuleCall_9_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_10() { return cRightCurlyBracketKeyword_10; }
 	}
-
 	public class InputElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "Input");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.Input");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cInputTypeKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cInputTypeAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -116,46 +118,46 @@
 		private final Assignment cFiltersAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
 		private final RuleCall cFiltersEQFilterParserRuleCall_4_1_0 = (RuleCall)cFiltersAssignment_4_1.eContents().get(0);
 		
-		//Input returns CxGridSourceInput:
-		//	"inputType" inputType=JvmTypeReference "filters" filters+=EQFilter ("&&" filters+=EQFilter)*;
-		public ParserRule getRule() { return rule; }
-
-		//"inputType" inputType=JvmTypeReference "filters" filters+=EQFilter ("&&" filters+=EQFilter)*
+		//Input CxGridSourceInput:
+		//	'inputType' inputType=JvmTypeReference
+		//	'filters' filters+=EQFilter ('&&' filters+=EQFilter)*;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'inputType' inputType=JvmTypeReference 'filters' filters+=EQFilter ('&&' filters+=EQFilter)*
 		public Group getGroup() { return cGroup; }
-
-		//"inputType"
+		
+		//'inputType'
 		public Keyword getInputTypeKeyword_0() { return cInputTypeKeyword_0; }
-
+		
 		//inputType=JvmTypeReference
 		public Assignment getInputTypeAssignment_1() { return cInputTypeAssignment_1; }
-
+		
 		//JvmTypeReference
 		public RuleCall getInputTypeJvmTypeReferenceParserRuleCall_1_0() { return cInputTypeJvmTypeReferenceParserRuleCall_1_0; }
-
-		//"filters"
+		
+		//'filters'
 		public Keyword getFiltersKeyword_2() { return cFiltersKeyword_2; }
-
+		
 		//filters+=EQFilter
 		public Assignment getFiltersAssignment_3() { return cFiltersAssignment_3; }
-
+		
 		//EQFilter
 		public RuleCall getFiltersEQFilterParserRuleCall_3_0() { return cFiltersEQFilterParserRuleCall_3_0; }
-
-		//("&&" filters+=EQFilter)*
+		
+		//('&&' filters+=EQFilter)*
 		public Group getGroup_4() { return cGroup_4; }
-
-		//"&&"
+		
+		//'&&'
 		public Keyword getAmpersandAmpersandKeyword_4_0() { return cAmpersandAmpersandKeyword_4_0; }
-
+		
 		//filters+=EQFilter
 		public Assignment getFiltersAssignment_4_1() { return cFiltersAssignment_4_1; }
-
+		
 		//EQFilter
 		public RuleCall getFiltersEQFilterParserRuleCall_4_1_0() { return cFiltersEQFilterParserRuleCall_4_1_0; }
 	}
-
 	public class EQFilterElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "EQFilter");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.EQFilter");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cCxGridSourceEQFilterAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cRootKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -166,40 +168,40 @@
 		private final Assignment cInputTypePropertyPathAssignment_5 = (Assignment)cGroup.eContents().get(5);
 		private final RuleCall cInputTypePropertyPathNestedFieldParserRuleCall_5_0 = (RuleCall)cInputTypePropertyPathAssignment_5.eContents().get(0);
 		
-		//EQFilter returns CxGridSourceEQFilter:
-		//	{CxGridSourceEQFilter} "root:" rootTypePropertyPath=NestedField "=" "input:" inputTypePropertyPath=NestedField;
-		public ParserRule getRule() { return rule; }
-
-		//{CxGridSourceEQFilter} "root:" rootTypePropertyPath=NestedField "=" "input:" inputTypePropertyPath=NestedField
+		//EQFilter CxGridSourceEQFilter:
+		//	{CxGridSourceEQFilter}
+		//	'root:' rootTypePropertyPath=NestedField '=' 'input:' inputTypePropertyPath=NestedField;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{CxGridSourceEQFilter} 'root:' rootTypePropertyPath=NestedField '=' 'input:' inputTypePropertyPath=NestedField
 		public Group getGroup() { return cGroup; }
-
+		
 		//{CxGridSourceEQFilter}
 		public Action getCxGridSourceEQFilterAction_0() { return cCxGridSourceEQFilterAction_0; }
-
-		//"root:"
+		
+		//'root:'
 		public Keyword getRootKeyword_1() { return cRootKeyword_1; }
-
+		
 		//rootTypePropertyPath=NestedField
 		public Assignment getRootTypePropertyPathAssignment_2() { return cRootTypePropertyPathAssignment_2; }
-
+		
 		//NestedField
 		public RuleCall getRootTypePropertyPathNestedFieldParserRuleCall_2_0() { return cRootTypePropertyPathNestedFieldParserRuleCall_2_0; }
-
-		//"="
+		
+		//'='
 		public Keyword getEqualsSignKeyword_3() { return cEqualsSignKeyword_3; }
-
-		//"input:"
+		
+		//'input:'
 		public Keyword getInputKeyword_4() { return cInputKeyword_4; }
-
+		
 		//inputTypePropertyPath=NestedField
 		public Assignment getInputTypePropertyPathAssignment_5() { return cInputTypePropertyPathAssignment_5; }
-
+		
 		//NestedField
 		public RuleCall getInputTypePropertyPathNestedFieldParserRuleCall_5_0() { return cInputTypePropertyPathNestedFieldParserRuleCall_5_0; }
 	}
-
 	public class PropertyElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "Property");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.Property");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cPropKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cPathAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -208,34 +210,33 @@
 		private final Assignment cStyleAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final RuleCall cStylePropertyStyleParserRuleCall_3_0 = (RuleCall)cStyleAssignment_3.eContents().get(0);
 		
-		//Property returns CxGridProperty:
-		//	"prop" path=NestedField "style" style=PropertyStyle;
-		public ParserRule getRule() { return rule; }
-
-		//"prop" path=NestedField "style" style=PropertyStyle
+		//Property CxGridProperty:
+		//	'prop' path=NestedField 'style' style=PropertyStyle;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'prop' path=NestedField 'style' style=PropertyStyle
 		public Group getGroup() { return cGroup; }
-
-		//"prop"
+		
+		//'prop'
 		public Keyword getPropKeyword_0() { return cPropKeyword_0; }
-
+		
 		//path=NestedField
 		public Assignment getPathAssignment_1() { return cPathAssignment_1; }
-
+		
 		//NestedField
 		public RuleCall getPathNestedFieldParserRuleCall_1_0() { return cPathNestedFieldParserRuleCall_1_0; }
-
-		//"style"
+		
+		//'style'
 		public Keyword getStyleKeyword_2() { return cStyleKeyword_2; }
-
+		
 		//style=PropertyStyle
 		public Assignment getStyleAssignment_3() { return cStyleAssignment_3; }
-
+		
 		//PropertyStyle
 		public RuleCall getStylePropertyStyleParserRuleCall_3_0() { return cStylePropertyStyleParserRuleCall_3_0; }
 	}
-
 	public class NestedFieldElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "NestedField");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.NestedField");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cCxGridNestedFieldAction_0 = (Action)cGroup.eContents().get(0);
 		private final Assignment cFieldAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -244,34 +245,33 @@
 		private final Assignment cPathAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final RuleCall cPathNestedPathParserRuleCall_2_0 = (RuleCall)cPathAssignment_2.eContents().get(0);
 		
-		//NestedField returns CxGridNestedField:
-		//	{CxGridNestedField} field=[JvmOperation] path=NestedPath?;
-		public ParserRule getRule() { return rule; }
-
-		//{CxGridNestedField} field=[JvmOperation] path=NestedPath?
+		//NestedField CxGridNestedField:
+		//	{CxGridNestedField} field=[types::JvmOperation] path=NestedPath?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{CxGridNestedField} field=[types::JvmOperation] path=NestedPath?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{CxGridNestedField}
 		public Action getCxGridNestedFieldAction_0() { return cCxGridNestedFieldAction_0; }
-
-		//field=[JvmOperation]
+		
+		//field=[types::JvmOperation]
 		public Assignment getFieldAssignment_1() { return cFieldAssignment_1; }
-
-		//[JvmOperation]
+		
+		//[types::JvmOperation]
 		public CrossReference getFieldJvmOperationCrossReference_1_0() { return cFieldJvmOperationCrossReference_1_0; }
-
+		
 		//ID
 		public RuleCall getFieldJvmOperationIDTerminalRuleCall_1_0_1() { return cFieldJvmOperationIDTerminalRuleCall_1_0_1; }
-
+		
 		//path=NestedPath?
 		public Assignment getPathAssignment_2() { return cPathAssignment_2; }
-
+		
 		//NestedPath
 		public RuleCall getPathNestedPathParserRuleCall_2_0() { return cPathNestedPathParserRuleCall_2_0; }
 	}
-
 	public class NestedPathElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "NestedPath");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.NestedPath");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cCxGridNestedPathAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cFullStopKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -281,37 +281,37 @@
 		private final Assignment cPathAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final RuleCall cPathNestedPathParserRuleCall_3_0 = (RuleCall)cPathAssignment_3.eContents().get(0);
 		
-		//NestedPath returns CxGridNestedPath:
-		//	{CxGridNestedPath} "." field=[JvmOperation] path=NestedPath?;
-		public ParserRule getRule() { return rule; }
-
-		//{CxGridNestedPath} "." field=[JvmOperation] path=NestedPath?
+		//NestedPath CxGridNestedPath:
+		//	{CxGridNestedPath}
+		//	'.' field=[types::JvmOperation] path=NestedPath?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{CxGridNestedPath} '.' field=[types::JvmOperation] path=NestedPath?
 		public Group getGroup() { return cGroup; }
-
+		
 		//{CxGridNestedPath}
 		public Action getCxGridNestedPathAction_0() { return cCxGridNestedPathAction_0; }
-
-		//"."
+		
+		//'.'
 		public Keyword getFullStopKeyword_1() { return cFullStopKeyword_1; }
-
-		//field=[JvmOperation]
+		
+		//field=[types::JvmOperation]
 		public Assignment getFieldAssignment_2() { return cFieldAssignment_2; }
-
-		//[JvmOperation]
+		
+		//[types::JvmOperation]
 		public CrossReference getFieldJvmOperationCrossReference_2_0() { return cFieldJvmOperationCrossReference_2_0; }
-
+		
 		//ID
 		public RuleCall getFieldJvmOperationIDTerminalRuleCall_2_0_1() { return cFieldJvmOperationIDTerminalRuleCall_2_0_1; }
-
+		
 		//path=NestedPath?
 		public Assignment getPathAssignment_3() { return cPathAssignment_3; }
-
+		
 		//NestedPath
 		public RuleCall getPathNestedPathParserRuleCall_3_0() { return cPathNestedPathParserRuleCall_3_0; }
 	}
-
 	public class PropertyStyleElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyStyle");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.PropertyStyle");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cPropertyButtonStyleParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cPropertyHtmlStyleParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
@@ -325,53 +325,52 @@
 		private final RuleCall cPropertyPriceStyleParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
 		private final RuleCall cGridPropIndicatorStyleParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
 		
-		//PropertyStyle returns style::CxGridPropStyle:
+		//PropertyStyle style::CxGridPropStyle:
 		//	PropertyButtonStyle | PropertyHtmlStyle | PropertyProgressbarStyle | PropertyTextStyle | PropertyBooleanStyle |
 		//	PropertyDateStyle | PropertyNumberStyle | PropertyImageStyle | PropertyQuantityStyle | PropertyPriceStyle |
 		//	GridPropIndicatorStyle;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//PropertyButtonStyle | PropertyHtmlStyle | PropertyProgressbarStyle | PropertyTextStyle | PropertyBooleanStyle |
 		//PropertyDateStyle | PropertyNumberStyle | PropertyImageStyle | PropertyQuantityStyle | PropertyPriceStyle |
 		//GridPropIndicatorStyle
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//PropertyButtonStyle
 		public RuleCall getPropertyButtonStyleParserRuleCall_0() { return cPropertyButtonStyleParserRuleCall_0; }
-
+		
 		//PropertyHtmlStyle
 		public RuleCall getPropertyHtmlStyleParserRuleCall_1() { return cPropertyHtmlStyleParserRuleCall_1; }
-
+		
 		//PropertyProgressbarStyle
 		public RuleCall getPropertyProgressbarStyleParserRuleCall_2() { return cPropertyProgressbarStyleParserRuleCall_2; }
-
+		
 		//PropertyTextStyle
 		public RuleCall getPropertyTextStyleParserRuleCall_3() { return cPropertyTextStyleParserRuleCall_3; }
-
+		
 		//PropertyBooleanStyle
 		public RuleCall getPropertyBooleanStyleParserRuleCall_4() { return cPropertyBooleanStyleParserRuleCall_4; }
-
+		
 		//PropertyDateStyle
 		public RuleCall getPropertyDateStyleParserRuleCall_5() { return cPropertyDateStyleParserRuleCall_5; }
-
+		
 		//PropertyNumberStyle
 		public RuleCall getPropertyNumberStyleParserRuleCall_6() { return cPropertyNumberStyleParserRuleCall_6; }
-
+		
 		//PropertyImageStyle
 		public RuleCall getPropertyImageStyleParserRuleCall_7() { return cPropertyImageStyleParserRuleCall_7; }
-
+		
 		//PropertyQuantityStyle
 		public RuleCall getPropertyQuantityStyleParserRuleCall_8() { return cPropertyQuantityStyleParserRuleCall_8; }
-
+		
 		//PropertyPriceStyle
 		public RuleCall getPropertyPriceStyleParserRuleCall_9() { return cPropertyPriceStyleParserRuleCall_9; }
-
+		
 		//GridPropIndicatorStyle
 		public RuleCall getGridPropIndicatorStyleParserRuleCall_10() { return cGridPropIndicatorStyleParserRuleCall_10; }
 	}
-
 	public class PropertyButtonStyleElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyButtonStyle");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.PropertyButtonStyle");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cCxGridPropButtonStyleAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cButtonStyleKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -379,71 +378,71 @@
 		private final Assignment cEventTopicAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final RuleCall cEventTopicSTRINGTerminalRuleCall_3_0 = (RuleCall)cEventTopicAssignment_3.eContents().get(0);
 		
-		//PropertyButtonStyle returns style::CxGridPropButtonStyle:
-		//	{style::CxGridPropButtonStyle} "buttonStyle" "eventTopic" eventTopic=STRING;
-		public ParserRule getRule() { return rule; }
-
-		//{style::CxGridPropButtonStyle} "buttonStyle" "eventTopic" eventTopic=STRING
+		//PropertyButtonStyle style::CxGridPropButtonStyle:
+		//	{style::CxGridPropButtonStyle}
+		//	'buttonStyle' 'eventTopic' eventTopic=STRING;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{style::CxGridPropButtonStyle} 'buttonStyle' 'eventTopic' eventTopic=STRING
 		public Group getGroup() { return cGroup; }
-
+		
 		//{style::CxGridPropButtonStyle}
 		public Action getCxGridPropButtonStyleAction_0() { return cCxGridPropButtonStyleAction_0; }
-
-		//"buttonStyle"
+		
+		//'buttonStyle'
 		public Keyword getButtonStyleKeyword_1() { return cButtonStyleKeyword_1; }
-
-		//"eventTopic"
+		
+		//'eventTopic'
 		public Keyword getEventTopicKeyword_2() { return cEventTopicKeyword_2; }
-
+		
 		//eventTopic=STRING
 		public Assignment getEventTopicAssignment_3() { return cEventTopicAssignment_3; }
-
+		
 		//STRING
 		public RuleCall getEventTopicSTRINGTerminalRuleCall_3_0() { return cEventTopicSTRINGTerminalRuleCall_3_0; }
 	}
-
 	public class PropertyHtmlStyleElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyHtmlStyle");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.PropertyHtmlStyle");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cCxGridPropHtmlStyleAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cHtmlStyleKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		
-		//PropertyHtmlStyle returns style::CxGridPropHtmlStyle:
-		//	{style::CxGridPropHtmlStyle} "htmlStyle";
-		public ParserRule getRule() { return rule; }
-
-		//{style::CxGridPropHtmlStyle} "htmlStyle"
+		//PropertyHtmlStyle style::CxGridPropHtmlStyle:
+		//	{style::CxGridPropHtmlStyle}
+		//	'htmlStyle';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{style::CxGridPropHtmlStyle} 'htmlStyle'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{style::CxGridPropHtmlStyle}
 		public Action getCxGridPropHtmlStyleAction_0() { return cCxGridPropHtmlStyleAction_0; }
-
-		//"htmlStyle"
+		
+		//'htmlStyle'
 		public Keyword getHtmlStyleKeyword_1() { return cHtmlStyleKeyword_1; }
 	}
-
 	public class PropertyBooleanStyleElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyBooleanStyle");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.PropertyBooleanStyle");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cCxGridPropBooleanStyleAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cBoolStyleKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		
-		//PropertyBooleanStyle returns style::CxGridPropBooleanStyle:
-		//	{style::CxGridPropBooleanStyle} "boolStyle";
-		public ParserRule getRule() { return rule; }
-
-		//{style::CxGridPropBooleanStyle} "boolStyle"
+		//PropertyBooleanStyle style::CxGridPropBooleanStyle:
+		//	{style::CxGridPropBooleanStyle}
+		//	'boolStyle';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{style::CxGridPropBooleanStyle} 'boolStyle'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{style::CxGridPropBooleanStyle}
 		public Action getCxGridPropBooleanStyleAction_0() { return cCxGridPropBooleanStyleAction_0; }
-
-		//"boolStyle"
+		
+		//'boolStyle'
 		public Keyword getBoolStyleKeyword_1() { return cBoolStyleKeyword_1; }
 	}
-
 	public class PropertyDateStyleElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyDateStyle");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.PropertyDateStyle");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cCxGridPropDateStyleAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cDateStyleKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -451,31 +450,31 @@
 		private final Assignment cDateFormatAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final RuleCall cDateFormatSTRINGTerminalRuleCall_3_0 = (RuleCall)cDateFormatAssignment_3.eContents().get(0);
 		
-		//PropertyDateStyle returns style::CxGridPropDateStyle:
-		//	{style::CxGridPropDateStyle} "dateStyle" "format" dateFormat=STRING;
-		public ParserRule getRule() { return rule; }
-
-		//{style::CxGridPropDateStyle} "dateStyle" "format" dateFormat=STRING
+		//PropertyDateStyle style::CxGridPropDateStyle:
+		//	{style::CxGridPropDateStyle}
+		//	'dateStyle' 'format' dateFormat=STRING;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{style::CxGridPropDateStyle} 'dateStyle' 'format' dateFormat=STRING
 		public Group getGroup() { return cGroup; }
-
+		
 		//{style::CxGridPropDateStyle}
 		public Action getCxGridPropDateStyleAction_0() { return cCxGridPropDateStyleAction_0; }
-
-		//"dateStyle"
+		
+		//'dateStyle'
 		public Keyword getDateStyleKeyword_1() { return cDateStyleKeyword_1; }
-
-		//"format"
+		
+		//'format'
 		public Keyword getFormatKeyword_2() { return cFormatKeyword_2; }
-
+		
 		//dateFormat=STRING
 		public Assignment getDateFormatAssignment_3() { return cDateFormatAssignment_3; }
-
+		
 		//STRING
 		public RuleCall getDateFormatSTRINGTerminalRuleCall_3_0() { return cDateFormatSTRINGTerminalRuleCall_3_0; }
 	}
-
 	public class PropertyNumberStyleElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyNumberStyle");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.PropertyNumberStyle");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cCxGridPropNumberStyleAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cNumberStyleKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -483,31 +482,31 @@
 		private final Assignment cNumberFormatAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final RuleCall cNumberFormatSTRINGTerminalRuleCall_3_0 = (RuleCall)cNumberFormatAssignment_3.eContents().get(0);
 		
-		//PropertyNumberStyle returns style::CxGridPropNumberStyle:
-		//	{style::CxGridPropNumberStyle} "numberStyle" "format" numberFormat=STRING;
-		public ParserRule getRule() { return rule; }
-
-		//{style::CxGridPropNumberStyle} "numberStyle" "format" numberFormat=STRING
+		//PropertyNumberStyle style::CxGridPropNumberStyle:
+		//	{style::CxGridPropNumberStyle}
+		//	'numberStyle' 'format' numberFormat=STRING;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{style::CxGridPropNumberStyle} 'numberStyle' 'format' numberFormat=STRING
 		public Group getGroup() { return cGroup; }
-
+		
 		//{style::CxGridPropNumberStyle}
 		public Action getCxGridPropNumberStyleAction_0() { return cCxGridPropNumberStyleAction_0; }
-
-		//"numberStyle"
+		
+		//'numberStyle'
 		public Keyword getNumberStyleKeyword_1() { return cNumberStyleKeyword_1; }
-
-		//"format"
+		
+		//'format'
 		public Keyword getFormatKeyword_2() { return cFormatKeyword_2; }
-
+		
 		//numberFormat=STRING
 		public Assignment getNumberFormatAssignment_3() { return cNumberFormatAssignment_3; }
-
+		
 		//STRING
 		public RuleCall getNumberFormatSTRINGTerminalRuleCall_3_0() { return cNumberFormatSTRINGTerminalRuleCall_3_0; }
 	}
-
 	public class PropertyProgressbarStyleElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyProgressbarStyle");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.PropertyProgressbarStyle");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cCxGridPropProgressbarStyleAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cProgressbarStyleKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -515,31 +514,31 @@
 		private final Assignment cMaxValueAssignment_3 = (Assignment)cGroup.eContents().get(3);
 		private final RuleCall cMaxValueLDoubleParserRuleCall_3_0 = (RuleCall)cMaxValueAssignment_3.eContents().get(0);
 		
-		//PropertyProgressbarStyle returns style::CxGridPropProgressbarStyle:
-		//	{style::CxGridPropProgressbarStyle} "progressbarStyle" "max" maxValue=LDouble;
-		public ParserRule getRule() { return rule; }
-
-		//{style::CxGridPropProgressbarStyle} "progressbarStyle" "max" maxValue=LDouble
+		//PropertyProgressbarStyle style::CxGridPropProgressbarStyle:
+		//	{style::CxGridPropProgressbarStyle}
+		//	'progressbarStyle' 'max' maxValue=LDouble;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{style::CxGridPropProgressbarStyle} 'progressbarStyle' 'max' maxValue=LDouble
 		public Group getGroup() { return cGroup; }
-
+		
 		//{style::CxGridPropProgressbarStyle}
 		public Action getCxGridPropProgressbarStyleAction_0() { return cCxGridPropProgressbarStyleAction_0; }
-
-		//"progressbarStyle"
+		
+		//'progressbarStyle'
 		public Keyword getProgressbarStyleKeyword_1() { return cProgressbarStyleKeyword_1; }
-
-		//"max"
+		
+		//'max'
 		public Keyword getMaxKeyword_2() { return cMaxKeyword_2; }
-
+		
 		//maxValue=LDouble
 		public Assignment getMaxValueAssignment_3() { return cMaxValueAssignment_3; }
-
+		
 		//LDouble
 		public RuleCall getMaxValueLDoubleParserRuleCall_3_0() { return cMaxValueLDoubleParserRuleCall_3_0; }
 	}
-
 	public class GridPropIndicatorStyleElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "GridPropIndicatorStyle");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.GridPropIndicatorStyle");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cCxGridPropIndicatorStyleAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cIndicatorStyleKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -550,40 +549,40 @@
 		private final Assignment cRedEndsAssignment_5 = (Assignment)cGroup.eContents().get(5);
 		private final RuleCall cRedEndsLDoubleParserRuleCall_5_0 = (RuleCall)cRedEndsAssignment_5.eContents().get(0);
 		
-		//GridPropIndicatorStyle returns style::CxGridPropIndicatorStyle:
-		//	{style::CxGridPropIndicatorStyle} "indicatorStyle" "greenFrom" greenStarts=LDouble "redUntil" redEnds=LDouble;
-		public ParserRule getRule() { return rule; }
-
-		//{style::CxGridPropIndicatorStyle} "indicatorStyle" "greenFrom" greenStarts=LDouble "redUntil" redEnds=LDouble
+		//GridPropIndicatorStyle style::CxGridPropIndicatorStyle:
+		//	{style::CxGridPropIndicatorStyle}
+		//	'indicatorStyle' 'greenFrom' greenStarts=LDouble 'redUntil' redEnds=LDouble;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{style::CxGridPropIndicatorStyle} 'indicatorStyle' 'greenFrom' greenStarts=LDouble 'redUntil' redEnds=LDouble
 		public Group getGroup() { return cGroup; }
-
+		
 		//{style::CxGridPropIndicatorStyle}
 		public Action getCxGridPropIndicatorStyleAction_0() { return cCxGridPropIndicatorStyleAction_0; }
-
-		//"indicatorStyle"
+		
+		//'indicatorStyle'
 		public Keyword getIndicatorStyleKeyword_1() { return cIndicatorStyleKeyword_1; }
-
-		//"greenFrom"
+		
+		//'greenFrom'
 		public Keyword getGreenFromKeyword_2() { return cGreenFromKeyword_2; }
-
+		
 		//greenStarts=LDouble
 		public Assignment getGreenStartsAssignment_3() { return cGreenStartsAssignment_3; }
-
+		
 		//LDouble
 		public RuleCall getGreenStartsLDoubleParserRuleCall_3_0() { return cGreenStartsLDoubleParserRuleCall_3_0; }
-
-		//"redUntil"
+		
+		//'redUntil'
 		public Keyword getRedUntilKeyword_4() { return cRedUntilKeyword_4; }
-
+		
 		//redEnds=LDouble
 		public Assignment getRedEndsAssignment_5() { return cRedEndsAssignment_5; }
-
+		
 		//LDouble
 		public RuleCall getRedEndsLDoubleParserRuleCall_5_0() { return cRedEndsLDoubleParserRuleCall_5_0; }
 	}
-
 	public class PropertyQuantityStyleElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyQuantityStyle");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.PropertyQuantityStyle");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cCxGridPropQuantityStyleAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cQuantityStyleKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -604,72 +603,73 @@
 		private final Assignment cUomPropertyPathAssignment_9 = (Assignment)cGroup.eContents().get(9);
 		private final RuleCall cUomPropertyPathNestedFieldParserRuleCall_9_0 = (RuleCall)cUomPropertyPathAssignment_9.eContents().get(0);
 		
-		//PropertyQuantityStyle returns style::CxGridPropQuantityStyle:
-		//	{style::CxGridPropQuantityStyle} "quantityStyle" htmlPattern=STRING? "value" "=" valuePropertyPath=NestedField ("("
-		//	"format" valueNumberFormat=STRING ")")? "uom" "=" uomPropertyPath=NestedField;
-		public ParserRule getRule() { return rule; }
-
-		//{style::CxGridPropQuantityStyle} "quantityStyle" htmlPattern=STRING? "value" "=" valuePropertyPath=NestedField ("("
-		//"format" valueNumberFormat=STRING ")")? "uom" "=" uomPropertyPath=NestedField
+		//PropertyQuantityStyle style::CxGridPropQuantityStyle:
+		//	{style::CxGridPropQuantityStyle}
+		//	'quantityStyle' htmlPattern=STRING? 'value' '=' valuePropertyPath=NestedField ('(' 'format' valueNumberFormat=STRING
+		//	')')? 'uom' '='
+		//	uomPropertyPath=NestedField;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{style::CxGridPropQuantityStyle} 'quantityStyle' htmlPattern=STRING? 'value' '=' valuePropertyPath=NestedField ('('
+		//'format' valueNumberFormat=STRING ')')? 'uom' '=' uomPropertyPath=NestedField
 		public Group getGroup() { return cGroup; }
-
+		
 		//{style::CxGridPropQuantityStyle}
 		public Action getCxGridPropQuantityStyleAction_0() { return cCxGridPropQuantityStyleAction_0; }
-
-		//"quantityStyle"
+		
+		//'quantityStyle'
 		public Keyword getQuantityStyleKeyword_1() { return cQuantityStyleKeyword_1; }
-
+		
 		//htmlPattern=STRING?
 		public Assignment getHtmlPatternAssignment_2() { return cHtmlPatternAssignment_2; }
-
+		
 		//STRING
 		public RuleCall getHtmlPatternSTRINGTerminalRuleCall_2_0() { return cHtmlPatternSTRINGTerminalRuleCall_2_0; }
-
-		//"value"
+		
+		//'value'
 		public Keyword getValueKeyword_3() { return cValueKeyword_3; }
-
-		//"="
+		
+		//'='
 		public Keyword getEqualsSignKeyword_4() { return cEqualsSignKeyword_4; }
-
+		
 		//valuePropertyPath=NestedField
 		public Assignment getValuePropertyPathAssignment_5() { return cValuePropertyPathAssignment_5; }
-
+		
 		//NestedField
 		public RuleCall getValuePropertyPathNestedFieldParserRuleCall_5_0() { return cValuePropertyPathNestedFieldParserRuleCall_5_0; }
-
-		//("(" "format" valueNumberFormat=STRING ")")?
+		
+		//('(' 'format' valueNumberFormat=STRING ')')?
 		public Group getGroup_6() { return cGroup_6; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_6_0() { return cLeftParenthesisKeyword_6_0; }
-
-		//"format"
+		
+		//'format'
 		public Keyword getFormatKeyword_6_1() { return cFormatKeyword_6_1; }
-
+		
 		//valueNumberFormat=STRING
 		public Assignment getValueNumberFormatAssignment_6_2() { return cValueNumberFormatAssignment_6_2; }
-
+		
 		//STRING
 		public RuleCall getValueNumberFormatSTRINGTerminalRuleCall_6_2_0() { return cValueNumberFormatSTRINGTerminalRuleCall_6_2_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_6_3() { return cRightParenthesisKeyword_6_3; }
-
-		//"uom"
+		
+		//'uom'
 		public Keyword getUomKeyword_7() { return cUomKeyword_7; }
-
-		//"="
+		
+		//'='
 		public Keyword getEqualsSignKeyword_8() { return cEqualsSignKeyword_8; }
-
+		
 		//uomPropertyPath=NestedField
 		public Assignment getUomPropertyPathAssignment_9() { return cUomPropertyPathAssignment_9; }
-
+		
 		//NestedField
 		public RuleCall getUomPropertyPathNestedFieldParserRuleCall_9_0() { return cUomPropertyPathNestedFieldParserRuleCall_9_0; }
 	}
-
 	public class PropertyPriceStyleElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyPriceStyle");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.PropertyPriceStyle");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cCxGridPropPriceStyleAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cPriceStyleKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -690,92 +690,93 @@
 		private final Assignment cCurrencyPropertyPathAssignment_9 = (Assignment)cGroup.eContents().get(9);
 		private final RuleCall cCurrencyPropertyPathNestedFieldParserRuleCall_9_0 = (RuleCall)cCurrencyPropertyPathAssignment_9.eContents().get(0);
 		
-		//PropertyPriceStyle returns style::CxGridPropPriceStyle:
-		//	{style::CxGridPropPriceStyle} "priceStyle" htmlPattern=STRING? "value" "=" valuePropertyPath=NestedField ("(" "format"
-		//	valueNumberFormat=STRING ")")? "currency" "=" currencyPropertyPath=NestedField;
-		public ParserRule getRule() { return rule; }
-
-		//{style::CxGridPropPriceStyle} "priceStyle" htmlPattern=STRING? "value" "=" valuePropertyPath=NestedField ("(" "format"
-		//valueNumberFormat=STRING ")")? "currency" "=" currencyPropertyPath=NestedField
+		//PropertyPriceStyle style::CxGridPropPriceStyle:
+		//	{style::CxGridPropPriceStyle}
+		//	'priceStyle' htmlPattern=STRING? 'value' '=' valuePropertyPath=NestedField ('(' 'format' valueNumberFormat=STRING
+		//	')')? 'currency' '='
+		//	currencyPropertyPath=NestedField;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{style::CxGridPropPriceStyle} 'priceStyle' htmlPattern=STRING? 'value' '=' valuePropertyPath=NestedField ('(' 'format'
+		//valueNumberFormat=STRING ')')? 'currency' '=' currencyPropertyPath=NestedField
 		public Group getGroup() { return cGroup; }
-
+		
 		//{style::CxGridPropPriceStyle}
 		public Action getCxGridPropPriceStyleAction_0() { return cCxGridPropPriceStyleAction_0; }
-
-		//"priceStyle"
+		
+		//'priceStyle'
 		public Keyword getPriceStyleKeyword_1() { return cPriceStyleKeyword_1; }
-
+		
 		//htmlPattern=STRING?
 		public Assignment getHtmlPatternAssignment_2() { return cHtmlPatternAssignment_2; }
-
+		
 		//STRING
 		public RuleCall getHtmlPatternSTRINGTerminalRuleCall_2_0() { return cHtmlPatternSTRINGTerminalRuleCall_2_0; }
-
-		//"value"
+		
+		//'value'
 		public Keyword getValueKeyword_3() { return cValueKeyword_3; }
-
-		//"="
+		
+		//'='
 		public Keyword getEqualsSignKeyword_4() { return cEqualsSignKeyword_4; }
-
+		
 		//valuePropertyPath=NestedField
 		public Assignment getValuePropertyPathAssignment_5() { return cValuePropertyPathAssignment_5; }
-
+		
 		//NestedField
 		public RuleCall getValuePropertyPathNestedFieldParserRuleCall_5_0() { return cValuePropertyPathNestedFieldParserRuleCall_5_0; }
-
-		//("(" "format" valueNumberFormat=STRING ")")?
+		
+		//('(' 'format' valueNumberFormat=STRING ')')?
 		public Group getGroup_6() { return cGroup_6; }
-
-		//"("
+		
+		//'('
 		public Keyword getLeftParenthesisKeyword_6_0() { return cLeftParenthesisKeyword_6_0; }
-
-		//"format"
+		
+		//'format'
 		public Keyword getFormatKeyword_6_1() { return cFormatKeyword_6_1; }
-
+		
 		//valueNumberFormat=STRING
 		public Assignment getValueNumberFormatAssignment_6_2() { return cValueNumberFormatAssignment_6_2; }
-
+		
 		//STRING
 		public RuleCall getValueNumberFormatSTRINGTerminalRuleCall_6_2_0() { return cValueNumberFormatSTRINGTerminalRuleCall_6_2_0; }
-
-		//")"
+		
+		//')'
 		public Keyword getRightParenthesisKeyword_6_3() { return cRightParenthesisKeyword_6_3; }
-
-		//"currency"
+		
+		//'currency'
 		public Keyword getCurrencyKeyword_7() { return cCurrencyKeyword_7; }
-
-		//"="
+		
+		//'='
 		public Keyword getEqualsSignKeyword_8() { return cEqualsSignKeyword_8; }
-
+		
 		//currencyPropertyPath=NestedField
 		public Assignment getCurrencyPropertyPathAssignment_9() { return cCurrencyPropertyPathAssignment_9; }
-
+		
 		//NestedField
 		public RuleCall getCurrencyPropertyPathNestedFieldParserRuleCall_9_0() { return cCurrencyPropertyPathNestedFieldParserRuleCall_9_0; }
 	}
-
 	public class PropertyTextStyleElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyTextStyle");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.PropertyTextStyle");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cCxGridPropTextStyleAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cTextStyleKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		
-		//PropertyTextStyle returns style::CxGridPropTextStyle:
-		//	{style::CxGridPropTextStyle} "textStyle";
-		public ParserRule getRule() { return rule; }
-
-		//{style::CxGridPropTextStyle} "textStyle"
+		//PropertyTextStyle style::CxGridPropTextStyle:
+		//	{style::CxGridPropTextStyle}
+		//	'textStyle';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{style::CxGridPropTextStyle} 'textStyle'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{style::CxGridPropTextStyle}
 		public Action getCxGridPropTextStyleAction_0() { return cCxGridPropTextStyleAction_0; }
-
-		//"textStyle"
+		
+		//'textStyle'
 		public Keyword getTextStyleKeyword_1() { return cTextStyleKeyword_1; }
 	}
-
 	public class PropertyImageStyleElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "PropertyImageStyle");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.PropertyImageStyle");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Action cCxGridPropImageStyleAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cImageStyleKeyword_1 = (Keyword)cGroup.eContents().get(1);
@@ -788,106 +789,105 @@
 		private final RuleCall cConfigsStyleConfigParserRuleCall_4_0 = (RuleCall)cConfigsAssignment_4.eContents().get(0);
 		private final Keyword cRightCurlyBracketKeyword_5 = (Keyword)cGroup.eContents().get(5);
 		
-		//PropertyImageStyle returns style::CxGridPropImageStyle:
-		//	{style::CxGridPropImageStyle} "imageStyle" ("eventTopic" eventTopic=STRING)? "{" configs+=StyleConfig* "}";
-		public ParserRule getRule() { return rule; }
-
-		//{style::CxGridPropImageStyle} "imageStyle" ("eventTopic" eventTopic=STRING)? "{" configs+=StyleConfig* "}"
+		//PropertyImageStyle style::CxGridPropImageStyle:
+		//	{style::CxGridPropImageStyle}
+		//	'imageStyle' ('eventTopic' eventTopic=STRING)? '{'
+		//	configs+=StyleConfig*
+		//	'}';
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{style::CxGridPropImageStyle} 'imageStyle' ('eventTopic' eventTopic=STRING)? '{' configs+=StyleConfig* '}'
 		public Group getGroup() { return cGroup; }
-
+		
 		//{style::CxGridPropImageStyle}
 		public Action getCxGridPropImageStyleAction_0() { return cCxGridPropImageStyleAction_0; }
-
-		//"imageStyle"
+		
+		//'imageStyle'
 		public Keyword getImageStyleKeyword_1() { return cImageStyleKeyword_1; }
-
-		//("eventTopic" eventTopic=STRING)?
+		
+		//('eventTopic' eventTopic=STRING)?
 		public Group getGroup_2() { return cGroup_2; }
-
-		//"eventTopic"
+		
+		//'eventTopic'
 		public Keyword getEventTopicKeyword_2_0() { return cEventTopicKeyword_2_0; }
-
+		
 		//eventTopic=STRING
 		public Assignment getEventTopicAssignment_2_1() { return cEventTopicAssignment_2_1; }
-
+		
 		//STRING
 		public RuleCall getEventTopicSTRINGTerminalRuleCall_2_1_0() { return cEventTopicSTRINGTerminalRuleCall_2_1_0; }
-
-		//"{"
+		
+		//'{'
 		public Keyword getLeftCurlyBracketKeyword_3() { return cLeftCurlyBracketKeyword_3; }
-
+		
 		//configs+=StyleConfig*
 		public Assignment getConfigsAssignment_4() { return cConfigsAssignment_4; }
-
+		
 		//StyleConfig
 		public RuleCall getConfigsStyleConfigParserRuleCall_4_0() { return cConfigsStyleConfigParserRuleCall_4_0; }
-
-		//"}"
+		
+		//'}'
 		public Keyword getRightCurlyBracketKeyword_5() { return cRightCurlyBracketKeyword_5; }
 	}
-
 	public class QualifiedNameElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "QualifiedName");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.QualifiedName");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final RuleCall cValidIDParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
 		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
 		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
 		private final RuleCall cValidIDParserRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
 		
-		//QualifiedName:
-		//	ValidID ("." ValidID)*;
-		public ParserRule getRule() { return rule; }
-
-		//ValidID ("." ValidID)*
+		//@ Override QualifiedName:
+		//	ValidID (=> '.' ValidID)*;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//ValidID (=> '.' ValidID)*
 		public Group getGroup() { return cGroup; }
-
+		
 		//ValidID
 		public RuleCall getValidIDParserRuleCall_0() { return cValidIDParserRuleCall_0; }
-
-		//(=> "." ValidID)*
+		
+		//(=> '.' ValidID)*
 		public Group getGroup_1() { return cGroup_1; }
-
-		//=> "."
+		
+		//=> '.'
 		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
-
+		
 		//ValidID
 		public RuleCall getValidIDParserRuleCall_1_1() { return cValidIDParserRuleCall_1_1; }
 	}
-
 	public class ValidIDElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "ValidID");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.ValidID");
 		private final RuleCall cIDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
 		
-		//ValidID:
+		//@ Override ValidID:
 		//	ID;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//ID
 		public RuleCall getIDTerminalRuleCall() { return cIDTerminalRuleCall; }
 	}
-
 	public class StyleConfigElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StyleConfig");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.StyleConfig");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cNumericToResourceStyleConfigParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cStringToResourceStyleConfigParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
 		
-		//StyleConfig returns style::CxGridStyleConfig:
+		//StyleConfig style::CxGridStyleConfig:
 		//	NumericToResourceStyleConfig | StringToResourceStyleConfig;
-		public ParserRule getRule() { return rule; }
-
+		@Override public ParserRule getRule() { return rule; }
+		
 		//NumericToResourceStyleConfig | StringToResourceStyleConfig
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//NumericToResourceStyleConfig
 		public RuleCall getNumericToResourceStyleConfigParserRuleCall_0() { return cNumericToResourceStyleConfigParserRuleCall_0; }
-
+		
 		//StringToResourceStyleConfig
 		public RuleCall getStringToResourceStyleConfigParserRuleCall_1() { return cStringToResourceStyleConfigParserRuleCall_1; }
 	}
-
 	public class NumericToResourceStyleConfigElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "NumericToResourceStyleConfig");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.NumericToResourceStyleConfig");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cNumberKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cCompareAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -898,40 +898,39 @@
 		private final Assignment cResourceThemePathAssignment_4 = (Assignment)cGroup.eContents().get(4);
 		private final RuleCall cResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0 = (RuleCall)cResourceThemePathAssignment_4.eContents().get(0);
 		
-		//NumericToResourceStyleConfig returns style::CxGridStyleConfigNumericToResource:
-		//	"number" compare=StyleCompare value=LDouble "then" resourceThemePath=THEME_RESOURCE;
-		public ParserRule getRule() { return rule; }
-
-		//"number" compare=StyleCompare value=LDouble "then" resourceThemePath=THEME_RESOURCE
+		//NumericToResourceStyleConfig style::CxGridStyleConfigNumericToResource:
+		//	'number' compare=StyleCompare value=LDouble 'then' resourceThemePath=THEME_RESOURCE;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'number' compare=StyleCompare value=LDouble 'then' resourceThemePath=THEME_RESOURCE
 		public Group getGroup() { return cGroup; }
-
-		//"number"
+		
+		//'number'
 		public Keyword getNumberKeyword_0() { return cNumberKeyword_0; }
-
+		
 		//compare=StyleCompare
 		public Assignment getCompareAssignment_1() { return cCompareAssignment_1; }
-
+		
 		//StyleCompare
 		public RuleCall getCompareStyleCompareEnumRuleCall_1_0() { return cCompareStyleCompareEnumRuleCall_1_0; }
-
+		
 		//value=LDouble
 		public Assignment getValueAssignment_2() { return cValueAssignment_2; }
-
+		
 		//LDouble
 		public RuleCall getValueLDoubleParserRuleCall_2_0() { return cValueLDoubleParserRuleCall_2_0; }
-
-		//"then"
+		
+		//'then'
 		public Keyword getThenKeyword_3() { return cThenKeyword_3; }
-
+		
 		//resourceThemePath=THEME_RESOURCE
 		public Assignment getResourceThemePathAssignment_4() { return cResourceThemePathAssignment_4; }
-
+		
 		//THEME_RESOURCE
 		public RuleCall getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0() { return cResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0; }
 	}
-
 	public class StringToResourceStyleConfigElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "StringToResourceStyleConfig");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.StringToResourceStyleConfig");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Keyword cStringKeyword_0 = (Keyword)cGroup.eContents().get(0);
 		private final Assignment cCompareAssignment_1 = (Assignment)cGroup.eContents().get(1);
@@ -942,97 +941,94 @@
 		private final Assignment cResourceThemePathAssignment_4 = (Assignment)cGroup.eContents().get(4);
 		private final RuleCall cResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0 = (RuleCall)cResourceThemePathAssignment_4.eContents().get(0);
 		
-		//StringToResourceStyleConfig returns style::CxGridStyleConfigStringToResource:
-		//	"string" compare=StyleCompare value=STRING "then" resourceThemePath=THEME_RESOURCE;
-		public ParserRule getRule() { return rule; }
-
-		//"string" compare=StyleCompare value=STRING "then" resourceThemePath=THEME_RESOURCE
+		//StringToResourceStyleConfig style::CxGridStyleConfigStringToResource:
+		//	'string' compare=StyleCompare value=STRING 'then' resourceThemePath=THEME_RESOURCE;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//'string' compare=StyleCompare value=STRING 'then' resourceThemePath=THEME_RESOURCE
 		public Group getGroup() { return cGroup; }
-
-		//"string"
+		
+		//'string'
 		public Keyword getStringKeyword_0() { return cStringKeyword_0; }
-
+		
 		//compare=StyleCompare
 		public Assignment getCompareAssignment_1() { return cCompareAssignment_1; }
-
+		
 		//StyleCompare
 		public RuleCall getCompareStyleCompareEnumRuleCall_1_0() { return cCompareStyleCompareEnumRuleCall_1_0; }
-
+		
 		//value=STRING
 		public Assignment getValueAssignment_2() { return cValueAssignment_2; }
-
+		
 		//STRING
 		public RuleCall getValueSTRINGTerminalRuleCall_2_0() { return cValueSTRINGTerminalRuleCall_2_0; }
-
-		//"then"
+		
+		//'then'
 		public Keyword getThenKeyword_3() { return cThenKeyword_3; }
-
+		
 		//resourceThemePath=THEME_RESOURCE
 		public Assignment getResourceThemePathAssignment_4() { return cResourceThemePathAssignment_4; }
-
+		
 		//THEME_RESOURCE
 		public RuleCall getResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0() { return cResourceThemePathTHEME_RESOURCETerminalRuleCall_4_0; }
 	}
-
 	public class LIntElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "LInt");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.LInt");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Alternatives cAlternatives_0 = (Alternatives)cGroup.eContents().get(0);
 		private final Keyword cPlusSignKeyword_0_0 = (Keyword)cAlternatives_0.eContents().get(0);
 		private final Keyword cHyphenMinusKeyword_0_1 = (Keyword)cAlternatives_0.eContents().get(1);
 		private final RuleCall cINTTerminalRuleCall_1 = (RuleCall)cGroup.eContents().get(1);
 		
-		//LInt returns ecore::EInt:
-		//	("+" | "-")? INT;
-		public ParserRule getRule() { return rule; }
-
-		//("+" | "-")? INT
+		//LInt ecore::EInt:
+		//	('+' | '-')? INT;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//('+' | '-')? INT
 		public Group getGroup() { return cGroup; }
-
-		//("+" | "-")?
+		
+		//('+' | '-')?
 		public Alternatives getAlternatives_0() { return cAlternatives_0; }
-
-		//"+"
+		
+		//'+'
 		public Keyword getPlusSignKeyword_0_0() { return cPlusSignKeyword_0_0; }
-
-		//"-"
+		
+		//'-'
 		public Keyword getHyphenMinusKeyword_0_1() { return cHyphenMinusKeyword_0_1; }
-
+		
 		//INT
 		public RuleCall getINTTerminalRuleCall_1() { return cINTTerminalRuleCall_1; }
 	}
-
 	public class LDoubleElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "LDouble");
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.LDouble");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final RuleCall cLIntParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
 		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
 		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
 		private final RuleCall cINTTerminalRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
 		
-		//LDouble returns ecore::EDouble:
-		//	LInt ("." INT)?;
-		public ParserRule getRule() { return rule; }
-
-		//LInt ("." INT)?
+		//LDouble ecore::EDouble:
+		//	LInt ('.' INT)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//LInt ('.' INT)?
 		public Group getGroup() { return cGroup; }
-
+		
 		//LInt
 		public RuleCall getLIntParserRuleCall_0() { return cLIntParserRuleCall_0; }
-
-		//("." INT)?
+		
+		//('.' INT)?
 		public Group getGroup_1() { return cGroup_1; }
-
-		//"."
+		
+		//'.'
 		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
-
+		
 		//INT
 		public RuleCall getINTTerminalRuleCall_1_1() { return cINTTerminalRuleCall_1_1; }
 	}
 	
-	
 	public class StyleCompareElements extends AbstractEnumRuleElementFinder {
-		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "StyleCompare");
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.StyleCompare");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final EnumLiteralDeclaration cEqualEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
 		private final Keyword cEqualEqualKeyword_0_0 = (Keyword)cEqualEnumLiteralDeclaration_0.eContents().get(0);
@@ -1051,44 +1047,44 @@
 		//	Equal="equal" | GreaterEqual="greater equal" | GreaterThan="greater than" | LowerEqual="lower equal" |
 		//	LowerThan="lower than" | NotEqual="not equal";
 		public EnumRule getRule() { return rule; }
-
+		
 		//Equal="equal" | GreaterEqual="greater equal" | GreaterThan="greater than" | LowerEqual="lower equal" |
 		//LowerThan="lower than" | NotEqual="not equal"
 		public Alternatives getAlternatives() { return cAlternatives; }
-
+		
 		//Equal="equal"
 		public EnumLiteralDeclaration getEqualEnumLiteralDeclaration_0() { return cEqualEnumLiteralDeclaration_0; }
-
+		
 		//"equal"
 		public Keyword getEqualEqualKeyword_0_0() { return cEqualEqualKeyword_0_0; }
-
+		
 		//GreaterEqual="greater equal"
 		public EnumLiteralDeclaration getGreaterEqualEnumLiteralDeclaration_1() { return cGreaterEqualEnumLiteralDeclaration_1; }
-
+		
 		//"greater equal"
 		public Keyword getGreaterEqualGreaterEqualKeyword_1_0() { return cGreaterEqualGreaterEqualKeyword_1_0; }
-
+		
 		//GreaterThan="greater than"
 		public EnumLiteralDeclaration getGreaterThanEnumLiteralDeclaration_2() { return cGreaterThanEnumLiteralDeclaration_2; }
-
+		
 		//"greater than"
 		public Keyword getGreaterThanGreaterThanKeyword_2_0() { return cGreaterThanGreaterThanKeyword_2_0; }
-
+		
 		//LowerEqual="lower equal"
 		public EnumLiteralDeclaration getLowerEqualEnumLiteralDeclaration_3() { return cLowerEqualEnumLiteralDeclaration_3; }
-
+		
 		//"lower equal"
 		public Keyword getLowerEqualLowerEqualKeyword_3_0() { return cLowerEqualLowerEqualKeyword_3_0; }
-
+		
 		//LowerThan="lower than"
 		public EnumLiteralDeclaration getLowerThanEnumLiteralDeclaration_4() { return cLowerThanEnumLiteralDeclaration_4; }
-
+		
 		//"lower than"
 		public Keyword getLowerThanLowerThanKeyword_4_0() { return cLowerThanLowerThanKeyword_4_0; }
-
+		
 		//NotEqual="not equal"
 		public EnumLiteralDeclaration getNotEqualEnumLiteralDeclaration_5() { return cNotEqualEnumLiteralDeclaration_5; }
-
+		
 		//"not equal"
 		public Keyword getNotEqualNotEqualKeyword_5_0() { return cNotEqualNotEqualKeyword_5_0; }
 	}
@@ -1116,7 +1112,7 @@
 	private final StyleConfigElements pStyleConfig;
 	private final NumericToResourceStyleConfigElements pNumericToResourceStyleConfig;
 	private final StringToResourceStyleConfigElements pStringToResourceStyleConfig;
-	private final StyleCompareElements unknownRuleStyleCompare;
+	private final StyleCompareElements eStyleCompare;
 	private final TerminalRule tID;
 	private final TerminalRule tINT;
 	private final TerminalRule tTHEME_RESOURCE;
@@ -1125,12 +1121,12 @@
 	private final TerminalRule tEVENT_TOPIC;
 	
 	private final Grammar grammar;
-
+	
 	private final XtypeGrammarAccess gaXtype;
 
 	@Inject
 	public GridSourceGrammarAccess(GrammarProvider grammarProvider,
-		XtypeGrammarAccess gaXtype) {
+			XtypeGrammarAccess gaXtype) {
 		this.grammar = internalFindGrammar(grammarProvider);
 		this.gaXtype = gaXtype;
 		this.pSource = new SourceElements();
@@ -1156,13 +1152,13 @@
 		this.pStyleConfig = new StyleConfigElements();
 		this.pNumericToResourceStyleConfig = new NumericToResourceStyleConfigElements();
 		this.pStringToResourceStyleConfig = new StringToResourceStyleConfigElements();
-		this.unknownRuleStyleCompare = new StyleCompareElements();
-		this.tID = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "ID");
-		this.tINT = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "INT");
-		this.tTHEME_RESOURCE = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "THEME_RESOURCE");
+		this.eStyleCompare = new StyleCompareElements();
+		this.tID = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.ID");
+		this.tINT = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.INT");
+		this.tTHEME_RESOURCE = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.THEME_RESOURCE");
 		this.pLInt = new LIntElements();
 		this.pLDouble = new LDoubleElements();
-		this.tEVENT_TOPIC = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "EVENT_TOPIC");
+		this.tEVENT_TOPIC = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.gridsource.GridSource.EVENT_TOPIC");
 	}
 	
 	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
@@ -1181,20 +1177,24 @@
 		return grammar;
 	}
 	
-	
+	@Override
 	public Grammar getGrammar() {
 		return grammar;
 	}
 	
-
+	
 	public XtypeGrammarAccess getXtypeGrammarAccess() {
 		return gaXtype;
 	}
 
 	
-	//Source returns CxGridSource:
-	//	"gridsource" id=QualifiedName "for" rootType=JvmTypeReference "{" "inputs" "{" inputs+=Input* "}"
-	//	properties+=Property* "}";
+	//Source CxGridSource:
+	//	'gridsource' id=QualifiedName 'for' rootType=JvmTypeReference '{'
+	//	'inputs' '{'
+	//	inputs+=Input*
+	//	'}'
+	//	properties+=Property*
+	//	'}';
 	public SourceElements getSourceAccess() {
 		return pSource;
 	}
@@ -1202,9 +1202,10 @@
 	public ParserRule getSourceRule() {
 		return getSourceAccess().getRule();
 	}
-
-	//Input returns CxGridSourceInput:
-	//	"inputType" inputType=JvmTypeReference "filters" filters+=EQFilter ("&&" filters+=EQFilter)*;
+	
+	//Input CxGridSourceInput:
+	//	'inputType' inputType=JvmTypeReference
+	//	'filters' filters+=EQFilter ('&&' filters+=EQFilter)*;
 	public InputElements getInputAccess() {
 		return pInput;
 	}
@@ -1212,9 +1213,10 @@
 	public ParserRule getInputRule() {
 		return getInputAccess().getRule();
 	}
-
-	//EQFilter returns CxGridSourceEQFilter:
-	//	{CxGridSourceEQFilter} "root:" rootTypePropertyPath=NestedField "=" "input:" inputTypePropertyPath=NestedField;
+	
+	//EQFilter CxGridSourceEQFilter:
+	//	{CxGridSourceEQFilter}
+	//	'root:' rootTypePropertyPath=NestedField '=' 'input:' inputTypePropertyPath=NestedField;
 	public EQFilterElements getEQFilterAccess() {
 		return pEQFilter;
 	}
@@ -1222,9 +1224,9 @@
 	public ParserRule getEQFilterRule() {
 		return getEQFilterAccess().getRule();
 	}
-
-	//Property returns CxGridProperty:
-	//	"prop" path=NestedField "style" style=PropertyStyle;
+	
+	//Property CxGridProperty:
+	//	'prop' path=NestedField 'style' style=PropertyStyle;
 	public PropertyElements getPropertyAccess() {
 		return pProperty;
 	}
@@ -1232,9 +1234,9 @@
 	public ParserRule getPropertyRule() {
 		return getPropertyAccess().getRule();
 	}
-
-	//NestedField returns CxGridNestedField:
-	//	{CxGridNestedField} field=[JvmOperation] path=NestedPath?;
+	
+	//NestedField CxGridNestedField:
+	//	{CxGridNestedField} field=[types::JvmOperation] path=NestedPath?;
 	public NestedFieldElements getNestedFieldAccess() {
 		return pNestedField;
 	}
@@ -1242,9 +1244,10 @@
 	public ParserRule getNestedFieldRule() {
 		return getNestedFieldAccess().getRule();
 	}
-
-	//NestedPath returns CxGridNestedPath:
-	//	{CxGridNestedPath} "." field=[JvmOperation] path=NestedPath?;
+	
+	//NestedPath CxGridNestedPath:
+	//	{CxGridNestedPath}
+	//	'.' field=[types::JvmOperation] path=NestedPath?;
 	public NestedPathElements getNestedPathAccess() {
 		return pNestedPath;
 	}
@@ -1252,8 +1255,8 @@
 	public ParserRule getNestedPathRule() {
 		return getNestedPathAccess().getRule();
 	}
-
-	//PropertyStyle returns style::CxGridPropStyle:
+	
+	//PropertyStyle style::CxGridPropStyle:
 	//	PropertyButtonStyle | PropertyHtmlStyle | PropertyProgressbarStyle | PropertyTextStyle | PropertyBooleanStyle |
 	//	PropertyDateStyle | PropertyNumberStyle | PropertyImageStyle | PropertyQuantityStyle | PropertyPriceStyle |
 	//	GridPropIndicatorStyle;
@@ -1264,9 +1267,10 @@
 	public ParserRule getPropertyStyleRule() {
 		return getPropertyStyleAccess().getRule();
 	}
-
-	//PropertyButtonStyle returns style::CxGridPropButtonStyle:
-	//	{style::CxGridPropButtonStyle} "buttonStyle" "eventTopic" eventTopic=STRING;
+	
+	//PropertyButtonStyle style::CxGridPropButtonStyle:
+	//	{style::CxGridPropButtonStyle}
+	//	'buttonStyle' 'eventTopic' eventTopic=STRING;
 	public PropertyButtonStyleElements getPropertyButtonStyleAccess() {
 		return pPropertyButtonStyle;
 	}
@@ -1274,9 +1278,10 @@
 	public ParserRule getPropertyButtonStyleRule() {
 		return getPropertyButtonStyleAccess().getRule();
 	}
-
-	//PropertyHtmlStyle returns style::CxGridPropHtmlStyle:
-	//	{style::CxGridPropHtmlStyle} "htmlStyle";
+	
+	//PropertyHtmlStyle style::CxGridPropHtmlStyle:
+	//	{style::CxGridPropHtmlStyle}
+	//	'htmlStyle';
 	public PropertyHtmlStyleElements getPropertyHtmlStyleAccess() {
 		return pPropertyHtmlStyle;
 	}
@@ -1284,9 +1289,10 @@
 	public ParserRule getPropertyHtmlStyleRule() {
 		return getPropertyHtmlStyleAccess().getRule();
 	}
-
-	//PropertyBooleanStyle returns style::CxGridPropBooleanStyle:
-	//	{style::CxGridPropBooleanStyle} "boolStyle";
+	
+	//PropertyBooleanStyle style::CxGridPropBooleanStyle:
+	//	{style::CxGridPropBooleanStyle}
+	//	'boolStyle';
 	public PropertyBooleanStyleElements getPropertyBooleanStyleAccess() {
 		return pPropertyBooleanStyle;
 	}
@@ -1294,9 +1300,10 @@
 	public ParserRule getPropertyBooleanStyleRule() {
 		return getPropertyBooleanStyleAccess().getRule();
 	}
-
-	//PropertyDateStyle returns style::CxGridPropDateStyle:
-	//	{style::CxGridPropDateStyle} "dateStyle" "format" dateFormat=STRING;
+	
+	//PropertyDateStyle style::CxGridPropDateStyle:
+	//	{style::CxGridPropDateStyle}
+	//	'dateStyle' 'format' dateFormat=STRING;
 	public PropertyDateStyleElements getPropertyDateStyleAccess() {
 		return pPropertyDateStyle;
 	}
@@ -1304,9 +1311,10 @@
 	public ParserRule getPropertyDateStyleRule() {
 		return getPropertyDateStyleAccess().getRule();
 	}
-
-	//PropertyNumberStyle returns style::CxGridPropNumberStyle:
-	//	{style::CxGridPropNumberStyle} "numberStyle" "format" numberFormat=STRING;
+	
+	//PropertyNumberStyle style::CxGridPropNumberStyle:
+	//	{style::CxGridPropNumberStyle}
+	//	'numberStyle' 'format' numberFormat=STRING;
 	public PropertyNumberStyleElements getPropertyNumberStyleAccess() {
 		return pPropertyNumberStyle;
 	}
@@ -1314,9 +1322,10 @@
 	public ParserRule getPropertyNumberStyleRule() {
 		return getPropertyNumberStyleAccess().getRule();
 	}
-
-	//PropertyProgressbarStyle returns style::CxGridPropProgressbarStyle:
-	//	{style::CxGridPropProgressbarStyle} "progressbarStyle" "max" maxValue=LDouble;
+	
+	//PropertyProgressbarStyle style::CxGridPropProgressbarStyle:
+	//	{style::CxGridPropProgressbarStyle}
+	//	'progressbarStyle' 'max' maxValue=LDouble;
 	public PropertyProgressbarStyleElements getPropertyProgressbarStyleAccess() {
 		return pPropertyProgressbarStyle;
 	}
@@ -1324,9 +1333,10 @@
 	public ParserRule getPropertyProgressbarStyleRule() {
 		return getPropertyProgressbarStyleAccess().getRule();
 	}
-
-	//GridPropIndicatorStyle returns style::CxGridPropIndicatorStyle:
-	//	{style::CxGridPropIndicatorStyle} "indicatorStyle" "greenFrom" greenStarts=LDouble "redUntil" redEnds=LDouble;
+	
+	//GridPropIndicatorStyle style::CxGridPropIndicatorStyle:
+	//	{style::CxGridPropIndicatorStyle}
+	//	'indicatorStyle' 'greenFrom' greenStarts=LDouble 'redUntil' redEnds=LDouble;
 	public GridPropIndicatorStyleElements getGridPropIndicatorStyleAccess() {
 		return pGridPropIndicatorStyle;
 	}
@@ -1334,10 +1344,12 @@
 	public ParserRule getGridPropIndicatorStyleRule() {
 		return getGridPropIndicatorStyleAccess().getRule();
 	}
-
-	//PropertyQuantityStyle returns style::CxGridPropQuantityStyle:
-	//	{style::CxGridPropQuantityStyle} "quantityStyle" htmlPattern=STRING? "value" "=" valuePropertyPath=NestedField ("("
-	//	"format" valueNumberFormat=STRING ")")? "uom" "=" uomPropertyPath=NestedField;
+	
+	//PropertyQuantityStyle style::CxGridPropQuantityStyle:
+	//	{style::CxGridPropQuantityStyle}
+	//	'quantityStyle' htmlPattern=STRING? 'value' '=' valuePropertyPath=NestedField ('(' 'format' valueNumberFormat=STRING
+	//	')')? 'uom' '='
+	//	uomPropertyPath=NestedField;
 	public PropertyQuantityStyleElements getPropertyQuantityStyleAccess() {
 		return pPropertyQuantityStyle;
 	}
@@ -1345,10 +1357,12 @@
 	public ParserRule getPropertyQuantityStyleRule() {
 		return getPropertyQuantityStyleAccess().getRule();
 	}
-
-	//PropertyPriceStyle returns style::CxGridPropPriceStyle:
-	//	{style::CxGridPropPriceStyle} "priceStyle" htmlPattern=STRING? "value" "=" valuePropertyPath=NestedField ("(" "format"
-	//	valueNumberFormat=STRING ")")? "currency" "=" currencyPropertyPath=NestedField;
+	
+	//PropertyPriceStyle style::CxGridPropPriceStyle:
+	//	{style::CxGridPropPriceStyle}
+	//	'priceStyle' htmlPattern=STRING? 'value' '=' valuePropertyPath=NestedField ('(' 'format' valueNumberFormat=STRING
+	//	')')? 'currency' '='
+	//	currencyPropertyPath=NestedField;
 	public PropertyPriceStyleElements getPropertyPriceStyleAccess() {
 		return pPropertyPriceStyle;
 	}
@@ -1356,9 +1370,10 @@
 	public ParserRule getPropertyPriceStyleRule() {
 		return getPropertyPriceStyleAccess().getRule();
 	}
-
-	//PropertyTextStyle returns style::CxGridPropTextStyle:
-	//	{style::CxGridPropTextStyle} "textStyle";
+	
+	//PropertyTextStyle style::CxGridPropTextStyle:
+	//	{style::CxGridPropTextStyle}
+	//	'textStyle';
 	public PropertyTextStyleElements getPropertyTextStyleAccess() {
 		return pPropertyTextStyle;
 	}
@@ -1366,9 +1381,12 @@
 	public ParserRule getPropertyTextStyleRule() {
 		return getPropertyTextStyleAccess().getRule();
 	}
-
-	//PropertyImageStyle returns style::CxGridPropImageStyle:
-	//	{style::CxGridPropImageStyle} "imageStyle" ("eventTopic" eventTopic=STRING)? "{" configs+=StyleConfig* "}";
+	
+	//PropertyImageStyle style::CxGridPropImageStyle:
+	//	{style::CxGridPropImageStyle}
+	//	'imageStyle' ('eventTopic' eventTopic=STRING)? '{'
+	//	configs+=StyleConfig*
+	//	'}';
 	public PropertyImageStyleElements getPropertyImageStyleAccess() {
 		return pPropertyImageStyle;
 	}
@@ -1376,9 +1394,9 @@
 	public ParserRule getPropertyImageStyleRule() {
 		return getPropertyImageStyleAccess().getRule();
 	}
-
-	//QualifiedName:
-	//	ValidID ("." ValidID)*;
+	
+	//@ Override QualifiedName:
+	//	ValidID (=> '.' ValidID)*;
 	public QualifiedNameElements getQualifiedNameAccess() {
 		return pQualifiedName;
 	}
@@ -1386,8 +1404,8 @@
 	public ParserRule getQualifiedNameRule() {
 		return getQualifiedNameAccess().getRule();
 	}
-
-	//ValidID:
+	
+	//@ Override ValidID:
 	//	ID;
 	public ValidIDElements getValidIDAccess() {
 		return pValidID;
@@ -1396,8 +1414,8 @@
 	public ParserRule getValidIDRule() {
 		return getValidIDAccess().getRule();
 	}
-
-	//StyleConfig returns style::CxGridStyleConfig:
+	
+	//StyleConfig style::CxGridStyleConfig:
 	//	NumericToResourceStyleConfig | StringToResourceStyleConfig;
 	public StyleConfigElements getStyleConfigAccess() {
 		return pStyleConfig;
@@ -1406,9 +1424,9 @@
 	public ParserRule getStyleConfigRule() {
 		return getStyleConfigAccess().getRule();
 	}
-
-	//NumericToResourceStyleConfig returns style::CxGridStyleConfigNumericToResource:
-	//	"number" compare=StyleCompare value=LDouble "then" resourceThemePath=THEME_RESOURCE;
+	
+	//NumericToResourceStyleConfig style::CxGridStyleConfigNumericToResource:
+	//	'number' compare=StyleCompare value=LDouble 'then' resourceThemePath=THEME_RESOURCE;
 	public NumericToResourceStyleConfigElements getNumericToResourceStyleConfigAccess() {
 		return pNumericToResourceStyleConfig;
 	}
@@ -1416,9 +1434,9 @@
 	public ParserRule getNumericToResourceStyleConfigRule() {
 		return getNumericToResourceStyleConfigAccess().getRule();
 	}
-
-	//StringToResourceStyleConfig returns style::CxGridStyleConfigStringToResource:
-	//	"string" compare=StyleCompare value=STRING "then" resourceThemePath=THEME_RESOURCE;
+	
+	//StringToResourceStyleConfig style::CxGridStyleConfigStringToResource:
+	//	'string' compare=StyleCompare value=STRING 'then' resourceThemePath=THEME_RESOURCE;
 	public StringToResourceStyleConfigElements getStringToResourceStyleConfigAccess() {
 		return pStringToResourceStyleConfig;
 	}
@@ -1426,38 +1444,38 @@
 	public ParserRule getStringToResourceStyleConfigRule() {
 		return getStringToResourceStyleConfigAccess().getRule();
 	}
-
+	
 	//enum StyleCompare returns style::CxGridCompare:
 	//	Equal="equal" | GreaterEqual="greater equal" | GreaterThan="greater than" | LowerEqual="lower equal" |
 	//	LowerThan="lower than" | NotEqual="not equal";
 	public StyleCompareElements getStyleCompareAccess() {
-		return unknownRuleStyleCompare;
+		return eStyleCompare;
 	}
 	
 	public EnumRule getStyleCompareRule() {
 		return getStyleCompareAccess().getRule();
 	}
-
-	//terminal ID:
-	//	"^"? ("a".."z" | "A".."Z" | "$" | "_") ("a".."z" | "A".."Z" | "$" | "_" | "0".."9")*;
+	
+	//@ Override terminal ID:
+	//	'^'? ('a'..'z' | 'A'..'Z' | '$' | '_') ('a'..'z' | 'A'..'Z' | '$' | '_' | '0'..'9')*;
 	public TerminalRule getIDRule() {
 		return tID;
-	} 
-
+	}
+	
 	//terminal INT returns ecore::EInt:
-	//	"0".."9" ("0".."9" | "_")*;
+	//	'0'..'9' ('0'..'9' | '_')*;
 	public TerminalRule getINTRule() {
 		return tINT;
-	} 
-
+	}
+	
 	//terminal THEME_RESOURCE:
-	//	"theme:/" ("a".."z" | "A".."Z" | "$" | "_" | "." | "/" | "0".."9")*;
+	//	'theme:/' ('a'..'z' | 'A'..'Z' | '$' | '_' | '.' | '/' | '0'..'9')*;
 	public TerminalRule getTHEME_RESOURCERule() {
 		return tTHEME_RESOURCE;
-	} 
-
-	//LInt returns ecore::EInt:
-	//	("+" | "-")? INT;
+	}
+	
+	//LInt ecore::EInt:
+	//	('+' | '-')? INT;
 	public LIntElements getLIntAccess() {
 		return pLInt;
 	}
@@ -1465,9 +1483,9 @@
 	public ParserRule getLIntRule() {
 		return getLIntAccess().getRule();
 	}
-
-	//LDouble returns ecore::EDouble:
-	//	LInt ("." INT)?;
+	
+	//LDouble ecore::EDouble:
+	//	LInt ('.' INT)?;
 	public LDoubleElements getLDoubleAccess() {
 		return pLDouble;
 	}
@@ -1475,16 +1493,16 @@
 	public ParserRule getLDoubleRule() {
 		return getLDoubleAccess().getRule();
 	}
-
+	
 	//terminal EVENT_TOPIC:
-	//	"\'" ID ("/" ID)* "/ *"? "\'";
+	//	"'" ID ('/' ID)* '/*'? "'";
 	public TerminalRule getEVENT_TOPICRule() {
 		return tEVENT_TOPIC;
-	} 
-
+	}
+	
 	//JvmTypeReference:
-	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)* |
-	//	XFunctionTypeRef;
+	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)*
+	//	| XFunctionTypeRef;
 	public XtypeGrammarAccess.JvmTypeReferenceElements getJvmTypeReferenceAccess() {
 		return gaXtype.getJvmTypeReferenceAccess();
 	}
@@ -1492,9 +1510,9 @@
 	public ParserRule getJvmTypeReferenceRule() {
 		return getJvmTypeReferenceAccess().getRule();
 	}
-
+	
 	//ArrayBrackets:
-	//	"[" "]";
+	//	'[' ']';
 	public XtypeGrammarAccess.ArrayBracketsElements getArrayBracketsAccess() {
 		return gaXtype.getArrayBracketsAccess();
 	}
@@ -1502,9 +1520,9 @@
 	public ParserRule getArrayBracketsRule() {
 		return getArrayBracketsAccess().getRule();
 	}
-
+	
 	//XFunctionTypeRef:
-	//	("(" (paramTypes+=JvmTypeReference ("," paramTypes+=JvmTypeReference)*)? ")")? "=>" returnType=JvmTypeReference;
+	//	('(' (paramTypes+=JvmTypeReference (',' paramTypes+=JvmTypeReference)*)? ')')? '=>' returnType=JvmTypeReference;
 	public XtypeGrammarAccess.XFunctionTypeRefElements getXFunctionTypeRefAccess() {
 		return gaXtype.getXFunctionTypeRefAccess();
 	}
@@ -1512,11 +1530,12 @@
 	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|super::ValidID] (=> '<' arguments+=JvmArgumentTypeReference (',' arguments+=JvmArgumentTypeReference)*
+	//	'>')?)*)?;
 	public XtypeGrammarAccess.JvmParameterizedTypeReferenceElements getJvmParameterizedTypeReferenceAccess() {
 		return gaXtype.getJvmParameterizedTypeReferenceAccess();
 	}
@@ -1524,8 +1543,8 @@
 	public ParserRule getJvmParameterizedTypeReferenceRule() {
 		return getJvmParameterizedTypeReferenceAccess().getRule();
 	}
-
-	//JvmArgumentTypeReference returns JvmTypeReference:
+	
+	//JvmArgumentTypeReference JvmTypeReference:
 	//	JvmTypeReference | JvmWildcardTypeReference;
 	public XtypeGrammarAccess.JvmArgumentTypeReferenceElements getJvmArgumentTypeReferenceAccess() {
 		return gaXtype.getJvmArgumentTypeReferenceAccess();
@@ -1534,10 +1553,10 @@
 	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 gaXtype.getJvmWildcardTypeReferenceAccess();
 	}
@@ -1545,9 +1564,9 @@
 	public ParserRule getJvmWildcardTypeReferenceRule() {
 		return getJvmWildcardTypeReferenceAccess().getRule();
 	}
-
+	
 	//JvmUpperBound:
-	//	"extends" typeReference=JvmTypeReference;
+	//	'extends' typeReference=JvmTypeReference;
 	public XtypeGrammarAccess.JvmUpperBoundElements getJvmUpperBoundAccess() {
 		return gaXtype.getJvmUpperBoundAccess();
 	}
@@ -1555,9 +1574,9 @@
 	public ParserRule getJvmUpperBoundRule() {
 		return getJvmUpperBoundAccess().getRule();
 	}
-
-	//JvmUpperBoundAnded returns JvmUpperBound:
-	//	"&" typeReference=JvmTypeReference;
+	
+	//JvmUpperBoundAnded JvmUpperBound:
+	//	'&' typeReference=JvmTypeReference;
 	public XtypeGrammarAccess.JvmUpperBoundAndedElements getJvmUpperBoundAndedAccess() {
 		return gaXtype.getJvmUpperBoundAndedAccess();
 	}
@@ -1565,9 +1584,9 @@
 	public ParserRule getJvmUpperBoundAndedRule() {
 		return getJvmUpperBoundAndedAccess().getRule();
 	}
-
+	
 	//JvmLowerBound:
-	//	"super" typeReference=JvmTypeReference;
+	//	'super' typeReference=JvmTypeReference;
 	public XtypeGrammarAccess.JvmLowerBoundElements getJvmLowerBoundAccess() {
 		return gaXtype.getJvmLowerBoundAccess();
 	}
@@ -1575,9 +1594,9 @@
 	public ParserRule getJvmLowerBoundRule() {
 		return getJvmLowerBoundAccess().getRule();
 	}
-
-	//JvmLowerBoundAnded returns JvmLowerBound:
-	//	"&" typeReference=JvmTypeReference;
+	
+	//JvmLowerBoundAnded JvmLowerBound:
+	//	'&' typeReference=JvmTypeReference;
 	public XtypeGrammarAccess.JvmLowerBoundAndedElements getJvmLowerBoundAndedAccess() {
 		return gaXtype.getJvmLowerBoundAndedAccess();
 	}
@@ -1585,9 +1604,9 @@
 	public ParserRule getJvmLowerBoundAndedRule() {
 		return getJvmLowerBoundAndedAccess().getRule();
 	}
-
+	
 	//JvmTypeParameter:
-	//	name=ValidID (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*)?;
+	//	name=super::ValidID (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*)?;
 	public XtypeGrammarAccess.JvmTypeParameterElements getJvmTypeParameterAccess() {
 		return gaXtype.getJvmTypeParameterAccess();
 	}
@@ -1595,9 +1614,9 @@
 	public ParserRule getJvmTypeParameterRule() {
 		return getJvmTypeParameterAccess().getRule();
 	}
-
+	
 	//QualifiedNameWithWildcard:
-	//	QualifiedName "." "*";
+	//	super::QualifiedName '.' '*';
 	public XtypeGrammarAccess.QualifiedNameWithWildcardElements getQualifiedNameWithWildcardAccess() {
 		return gaXtype.getQualifiedNameWithWildcardAccess();
 	}
@@ -1605,7 +1624,7 @@
 	public ParserRule getQualifiedNameWithWildcardRule() {
 		return getQualifiedNameWithWildcardAccess().getRule();
 	}
-
+	
 	//XImportSection:
 	//	importDeclarations+=XImportDeclaration+;
 	public XtypeGrammarAccess.XImportSectionElements getXImportSectionAccess() {
@@ -1615,11 +1634,11 @@
 	public ParserRule getXImportSectionRule() {
 		return getXImportSectionAccess().getRule();
 	}
-
+	
 	//XImportDeclaration:
-	//	"import" (static?="static" extension?="extension"? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
-	//	(wildcard?="*" | memberName=ValidID) | importedType=[JvmDeclaredType|QualifiedName] |
-	//	importedNamespace=QualifiedNameWithWildcard) ";"?;
+	//	'import' (static?='static' extension?='extension'? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
+	//	(wildcard?='*' | memberName=super::ValidID) | importedType=[JvmDeclaredType|super::QualifiedName] |
+	//	importedNamespace=QualifiedNameWithWildcard) ';'?;
 	public XtypeGrammarAccess.XImportDeclarationElements getXImportDeclarationAccess() {
 		return gaXtype.getXImportDeclarationAccess();
 	}
@@ -1627,9 +1646,9 @@
 	public ParserRule getXImportDeclarationRule() {
 		return getXImportDeclarationAccess().getRule();
 	}
-
+	
 	//QualifiedNameInStaticImport:
-	//	(ValidID ".")+;
+	//	(super::ValidID '.')+;
 	public XtypeGrammarAccess.QualifiedNameInStaticImportElements getQualifiedNameInStaticImportAccess() {
 		return gaXtype.getQualifiedNameInStaticImportAccess();
 	}
@@ -1637,35 +1656,35 @@
 	public ParserRule getQualifiedNameInStaticImportRule() {
 		return getQualifiedNameInStaticImportAccess().getRule();
 	}
-
+	
 	//terminal STRING:
-	//	"\"" ("\\" . / * ('b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\') * / | !("\\" | "\""))* "\""? | "\'" ("\\" .
-	//	/ * ('b'|'t'|'n'|'f'|'r'|'u'|'"'|"'"|'\\') * / | !("\\" | "\'"))* "\'"?;
+	//	'"' ('\\' . | !('\\' | '"'))* '"'? |
+	//	"'" ('\\' . | !('\\' | "'"))* "'"?;
 	public TerminalRule getSTRINGRule() {
 		return gaXtype.getSTRINGRule();
-	} 
-
+	}
+	
 	//terminal ML_COMMENT:
-	//	"/ *"->"* /";
+	//	'/*'->'*/';
 	public TerminalRule getML_COMMENTRule() {
 		return gaXtype.getML_COMMENTRule();
-	} 
-
+	}
+	
 	//terminal SL_COMMENT:
-	//	"//" !("\n" | "\r")* ("\r"? "\n")?;
+	//	'//' !('\n' | '\r')* ('\r'? '\n')?;
 	public TerminalRule getSL_COMMENTRule() {
 		return gaXtype.getSL_COMMENTRule();
-	} 
-
+	}
+	
 	//terminal WS:
-	//	(" " | "\t" | "\r" | "\n")+;
+	//	' ' | '\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.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/validation/AbstractGridSourceValidator.java b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/validation/AbstractGridSourceValidator.java
index bfc7597..e65ddb1 100644
--- a/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/validation/AbstractGridSourceValidator.java
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/validation/AbstractGridSourceValidator.java
@@ -1,31 +1,23 @@
-/**
- *                                                                            
- *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
- *                                                                            
- *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
- *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
- *                                                                            
- *  Contributors:                                                      
- * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
- * 
+/*
+ * generated by Xtext 2.11.0
  */
 package org.eclipse.osbp.xtext.gridsource.validation;
 
 import java.util.ArrayList;
 import java.util.List;
 import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.xtext.xbase.validation.XtypeValidator;
 
-public class AbstractGridSourceValidator extends org.eclipse.xtext.xbase.validation.XtypeValidator {
-
+public abstract class AbstractGridSourceValidator extends XtypeValidator {
+	
 	@Override
 	protected List<EPackage> getEPackages() {
-	    List<EPackage> result = new ArrayList<EPackage>(super.getEPackages());
-	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://osbp.eclipse.org/gridsource/v1/core"));
-	    result.add(EPackage.Registry.INSTANCE.getEPackage("http://osbp.eclipse.org/gridsource/v1/core/style"));
-	    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/gridsource/v1/core"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://osbp.eclipse.org/gridsource/v1/core/style"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtext/common/JavaVMTypes"));
+		result.add(EPackage.Registry.INSTANCE.getEPackage("http://www.eclipse.org/xtext/xbase/Xtype"));
 		return result;
 	}
+	
 }
diff --git a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GenerateGridSource.mwe2 b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GenerateGridSource.mwe2
index 77fcf22..382fc99 100644
--- a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GenerateGridSource.mwe2
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GenerateGridSource.mwe2
@@ -14,155 +14,62 @@
 module org.eclipse.osbp.xtext.GenerateGridSource
 
 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 = "gridsource"
-var projectName = "org.eclipse.osbp.xtext.gridsource"
-var grammarURI = "platform:/resource/${projectName}/src/org/eclipse/osbp/xtext/gridsource/GridSource.xtext"
-var runtimeProject = "../${projectName}"
-var generateXtendStub = true
-var encoding = "UTF-8"
+var rootPath = ".."
 
 Workflow {
-	
-	bean = org.eclipse.osbp.dsl.mwe.SemanticModelSetupComponent {
-		ePackage = org.eclipse.osbp.dsl.mwe.PackageMapping {
-			nsURI = "http://osbp.eclipse.org/gridsource/v1/core"
-			packageClass = "org.eclipse.osbp.infogrid.model.gridsource.CxGridSourcePackage"
-			factoryClass = "org.eclipse.osbp.infogrid.model.gridsource.impl.CxGridSourceFactoryImpl"
+
+	component = XtextGenerator {
+		configuration = {
+			project = StandardProjectConfig {
+				baseName = "org.eclipse.osbp.xtext.gridsource"
+				rootPath = rootPath
+				genericIde = {
+					enabled=true
+					name = "org.eclipse.osbp.xtext.gridsource.ide"
+				}
+				runtimeTest = {
+					enabled = true
+				}
+				eclipsePlugin = {
+					enabled = true
+				}
+				eclipsePluginTest = {
+					enabled = false
+				}
+				createEclipseMetaData = true
+			}
+			code = {
+				encoding = "UTF-8"
+				lineDelimiter = "\n"
+				fileHeader = "/*\n * generated by Xtext \${version}\n */"
+			}
 		}
-		
-		ePackage = org.eclipse.osbp.dsl.mwe.PackageMapping {
-			nsURI = "http://osbp.eclipse.org/gridsource/v1/core/style"
-			packageClass = "org.eclipse.osbp.infogrid.model.gridsource.style.CxGridStylePackage"
-			factoryClass = "org.eclipse.osbp.infogrid.model.gridsource.style.impl.CxGridStyleFactoryImpl"
+
+		language = StandardLanguage {
+			name = "org.eclipse.osbp.xtext.gridsource.GridSource"
+			fileExtensions = "gridsource"
+			referencedResource = "platform:/resource/org.eclipse.osbp.infogrid.model/model/gridsource.ecore"
+			referencedResource = "platform:/resource/org.eclipse.osbp.infogrid.model/model/gridsource.genmodel"
+			
+			generateXtendStubs = false
+			
+			serializer = {
+				generateStub = false
+			}
+			validator = {
+			// composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
+			}
+			
+			generator = {
+				generateStub=false
+				generateJavaMain=false
+				generateXtendStub=false
+			}
+			
 		}
 	}
-	
-    bean = org.eclipse.osbp.dsl.mwe.MavenStandaloneSetup {
-    	scanClassPath = true
-    	platformUri = "${runtimeProject}/.."
-    	registerEcoreFile = "platform:/resource/org.eclipse.osbp.infogrid.model/model/gridsource.ecore"
-    	registerGenModelFile = "platform:/resource/org.eclipse.osbp.infogrid.model/model/gridsource.genmodel"
-    	registerGeneratedEPackage = "org.eclipse.osbp.infogrid.model.gridsource.CxGridSourcePackage"
-    	registerGeneratedEPackage = "org.eclipse.osbp.infogrid.model.gridsource.style.CxGridStylePackage"
-    	registerEcoreFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xtype.ecore"
-    	registerEcoreFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.ecore"
-		registerGenModelFile = "platform:/resource/org.eclipse.xtext.xbase/model/Xbase.genmodel"
-    }
-    
-    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 {
-    		
-    		loadedResource = "platform:/resource/org.eclipse.osbp.infogrid.model/model/gridsource.ecore"
-    		
-    		uri = grammarURI
-    
-    		// Java API to access grammar elements (required by several other fragments)
-    		fragment = grammarAccess.GrammarAccessFragment auto-inject {}
-//    
-//    		// generates Java API for the generated EPackages
-//    		fragment = ecore.EMFGeneratorFragment auto-inject {}
-    
-    		// the old serialization component
-    		// fragment = parseTreeConstructor.ParseTreeConstructorFragment auto-inject {}    
-    
-    		// serializer 2.0
-    		fragment = serializer.SerializerFragment auto-inject {
-    			generateStub = false
-    		}
-    
-    		// a custom ResourceFactory for use with EMF
-    		fragment = resourceFactory.ResourceFactoryFragment auto-inject {}
-    
-    		// The antlr parser generator fragment.
-    		fragment = parser.antlr.XtextAntlrGeneratorFragment auto-inject {
-    		//  options = {
-    		//      backtrack = true
-    		//  }
-    		}
-    
-    		// Xtend-based API for validation
-    		fragment = validation.ValidatorFragment auto-inject {
-    		//    composedCheck = "org.eclipse.xtext.validation.ImportUriValidator"
-    		//    composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
-    		}
-    
-    		// 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.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GridSource.xtext b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GridSource.xtext
index 051e78c..498b87f 100644
--- a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GridSource.xtext
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GridSource.xtext
@@ -1,9 +1,9 @@
 grammar org.eclipse.osbp.xtext.gridsource.GridSource with org.eclipse.xtext.xbase.Xtype
 
+import "http://osbp.eclipse.org/gridsource/v1/core"
+import "http://osbp.eclipse.org/gridsource/v1/core/style" as style
+import "http://www.eclipse.org/xtext/common/JavaVMTypes" as types
 import "http://www.eclipse.org/emf/2002/Ecore" as ecore 
-import "http://www.eclipse.org/xtext/common/JavaVMTypes"
-import "platform:/resource/org.eclipse.osbp.infogrid.model/model/gridsource.ecore"
-import "platform:/resource/org.eclipse.osbp.infogrid.model/model/gridsource.ecore#//style" as style
 
 Source returns CxGridSource:
 	'gridsource' id=QualifiedName 'for' rootType=JvmTypeReference '{'
@@ -26,11 +26,11 @@
 
 NestedField returns CxGridNestedField:
 	{CxGridNestedField}
-	field=[JvmOperation] path=(NestedPath)?;
+	field=[types::JvmOperation] path=(NestedPath)?;
 
 NestedPath returns CxGridNestedPath:
 	{CxGridNestedPath}
-	'.' field=[JvmOperation] path=(NestedPath)?;
+	'.' field=[types::JvmOperation] path=(NestedPath)?;
 
 PropertyStyle returns style::CxGridPropStyle:
 	PropertyButtonStyle | PropertyHtmlStyle | PropertyProgressbarStyle | PropertyTextStyle |
@@ -87,9 +87,11 @@
 	configs+=StyleConfig*
 	'}';
 
+@Override 
 QualifiedName:
 	ValidID (=> '.' ValidID)*;
 
+@Override 
 ValidID:
 	ID;
 
@@ -106,6 +108,7 @@
 	Equal="equal" | GreaterEqual="greater equal" | GreaterThan="greater than" | LowerEqual="lower equal" |
 	LowerThan="lower than" | NotEqual="not equal";
 
+@Override 
 terminal ID:
 	'^'? ('a'..'z' | 'A'..'Z' | '$' | '_') ('a'..'z' | 'A'..'Z' | '$' | '_' | '0'..'9')*;
 
diff --git a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GridSourceRuntimeModule.java b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GridSourceRuntimeModule.java
index dffd403..efee87e 100644
--- a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GridSourceRuntimeModule.java
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GridSourceRuntimeModule.java
@@ -14,7 +14,11 @@
  package org.eclipse.osbp.xtext.gridsource;
 
 import org.eclipse.xtext.conversion.IValueConverterService;
+import org.eclipse.xtext.findReferences.TargetURICollector;
 import org.eclipse.xtext.generator.IOutputConfigurationProvider;
+import org.eclipse.xtext.resource.persistence.IResourceStorageFacade;
+import org.eclipse.xtext.xbase.jvmmodel.JvmModelTargetURICollector;
+import org.eclipse.xtext.xbase.resource.BatchLinkableResourceStorageFacade;
 import org.eclipse.osbp.xtext.gridsource.converter.ValueConverterService;
 import org.eclipse.osbp.xtext.gridsource.generator.OutputConfigurationProvider;
 
@@ -25,6 +29,14 @@
 public class GridSourceRuntimeModule extends
 		org.eclipse.osbp.xtext.gridsource.AbstractGridSourceRuntimeModule {
 
+	public Class<? extends IResourceStorageFacade> bindResourceStorageFacade() {
+		return BatchLinkableResourceStorageFacade.class;
+	}
+	
+	public Class<? extends TargetURICollector> bindTargetURICollector() {
+		return JvmModelTargetURICollector.class;
+	}
+	
 	public Class<? extends IOutputConfigurationProvider> bindIOutputConfigurationProvider() {
 		return OutputConfigurationProvider.class;
 	}
diff --git a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/scoping/GridSourceScopeProvider.xtend b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/scoping/GridSourceScopeProvider.xtend
index aaef6c9..f1ecad8 100644
--- a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/scoping/GridSourceScopeProvider.xtend
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/scoping/GridSourceScopeProvider.xtend
@@ -12,9 +12,9 @@
  * 
  * 
  *  This copyright notice shows up in the generated Java code
- *
+ * 
  */
- 
+
 package org.eclipse.osbp.xtext.gridsource.scoping
 
 import java.util.List
@@ -22,13 +22,6 @@
 import org.eclipse.emf.ecore.EObject
 import org.eclipse.emf.ecore.EReference
 import org.eclipse.emf.ecore.util.EcoreUtil
-import org.eclipse.xtext.common.types.JvmDeclaredType
-import org.eclipse.xtext.common.types.JvmType
-import org.eclipse.xtext.resource.EObjectDescription
-import org.eclipse.xtext.resource.IEObjectDescription
-import org.eclipse.xtext.scoping.IScope
-import org.eclipse.xtext.scoping.impl.AbstractScope
-import org.eclipse.xtext.xbase.scoping.XtypeScopeProvider
 import org.eclipse.osbp.infogrid.model.gridsource.CxGridNestedField
 import org.eclipse.osbp.infogrid.model.gridsource.CxGridNestedPath
 import org.eclipse.osbp.infogrid.model.gridsource.CxGridProperty
@@ -39,16 +32,18 @@
 import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropPriceStyle
 import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropQuantityStyle
 import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropSparklineStyle
+import org.eclipse.xtext.common.types.JvmDeclaredType
+import org.eclipse.xtext.common.types.JvmType
+import org.eclipse.xtext.resource.EObjectDescription
+import org.eclipse.xtext.resource.IEObjectDescription
+import org.eclipse.xtext.scoping.IScope
+import org.eclipse.xtext.scoping.impl.AbstractScope
 
 import static extension org.eclipse.osbp.infogrid.model.gridsource.util.Util.*
 
-class GridSourceScopeProvider extends XtypeScopeProvider {
+class GridSourceScopeProvider extends AbstractGridSourceScopeProvider {
 
 	override IScope getScope(EObject context, EReference reference) {
-
-		if (context instanceof CxGridNestedField) {
-		}
-
 		return super.getScope(context, reference);
 	}
 
@@ -93,6 +88,9 @@
 					return toGetterScope(model.rootType.type)
 				}
 			}
+		} else if (container instanceof CxGridProperty) {
+			val CxGridSource source = EcoreUtil.getRootContainer(container) as CxGridSource
+			return toGetterScope(source.rootType.type)
 		}
 		return null
 	}
@@ -114,7 +112,7 @@
 				override protected getAllLocalElements() {
 					val List<IEObjectDescription> descriptions = newArrayList()
 					for (field : info.values.filter [
-						!isStaticField && field != null && !name.equals("class")
+						!isStaticField && field !== null && !name.equals("class")
 					]) {
 						val Map<String, String> userData = newHashMap()
 						userData.put("readonly", field.readonly.toString)
diff --git a/pom.xml b/pom.xml
index e17edf6..e5d076f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -44,6 +44,7 @@
     <modules>
         <module>org.eclipse.osbp.xtext.gridsource</module>
         <module>org.eclipse.osbp.xtext.gridsource.tests</module>
+        <module>org.eclipse.osbp.xtext.gridsource.ide</module>
         <module>org.eclipse.osbp.xtext.gridsource.ui</module>
     
         <module>org.eclipse.osbp.xtext.gridsource.feature</module>
