diff --git a/.project b/.project
new file mode 100644
index 0000000..4b4794f
--- /dev/null
+++ b/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osbp.xtext.gridsource</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+	</natures>
+</projectDescription>
diff --git a/about.html b/about.html
new file mode 100644
index 0000000..64c0598
--- /dev/null
+++ b/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/jenkins.build.config.xml b/jenkins.build.config.xml
new file mode 100644
index 0000000..edf96a3
--- /dev/null
+++ b/jenkins.build.config.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--#======================================================================= -->
+<!--# Copyright (c) 2016 - Loetz GmbH&Co.KG                                    -->
+<!--# 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                           -->
+<!--#======================================================================= -->
+<!--# Module specific parameters for the Jenkins Job 						 -->
+<!--#======================================================================= -->
+
+<jenkins>
+	<!-- DO NOT EDIT BELOW THIS LINE -->
+        <jenkins.build.dependencies>
+                <jenkins.build.dependency>org.eclipse.osbp.dsl</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.infogrid</jenkins.build.dependency>
+                <jenkins.build.dependency>org.eclipse.osbp.utils</jenkins.build.dependency>
+        </jenkins.build.dependencies>
+</jenkins>
diff --git a/notice.html b/notice.html
new file mode 100644
index 0000000..c3d34c3
--- /dev/null
+++ b/notice.html
@@ -0,0 +1,107 @@
+<?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>April 9, 2014</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  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
+   (&quot;EPL&quot;).  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, &quot;Program&quot; 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 (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</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 (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</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 &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; 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 (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; 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 &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  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 &quot;src&quot; 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 (&quot;Feature Update License&quot;) 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 &quot;license&quot; property of files named &quot;feature.properties&quot; 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>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 (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). 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>
+   (&quot;Specification&quot;).</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 (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) 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 (&quot;Installable Software Agreement&quot;) 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>
diff --git a/org.eclipse.osbp.xtext.gridsource.feature/.project b/org.eclipse.osbp.xtext.gridsource.feature/.project
new file mode 100644
index 0000000..c9e8598
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.feature/.project
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osbp.xtext.gridsource.feature</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osbp.xtext.gridsource.feature/LICENSE.txt b/org.eclipse.osbp.xtext.gridsource.feature/LICENSE.txt
new file mode 100644
index 0000000..ff42ad4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.feature/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.feature/build.properties b/org.eclipse.osbp.xtext.gridsource.feature/build.properties
new file mode 100644
index 0000000..01b8b1b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.feature/build.properties
@@ -0,0 +1,6 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               epl-v10.html,\
+               build.properties,\
+               LICENSE.txt,\
+               license.html
diff --git a/org.eclipse.osbp.xtext.gridsource.feature/epl-v10.html b/org.eclipse.osbp.xtext.gridsource.feature/epl-v10.html
new file mode 100644
index 0000000..b398acc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.feature/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.feature/feature.properties b/org.eclipse.osbp.xtext.gridsource.feature/feature.properties
new file mode 100644
index 0000000..7fd338b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.feature/feature.properties
@@ -0,0 +1,169 @@
+###############################################################################
+# 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:
+#     Klemens Edler - initial API and implementation
+###############################################################################
+# feature.properties
+# contains externalized strings for feature.xml
+# "%foo" in feature.xml corresponds to the key "foo" in this file
+# java.io.Properties file (ISO 8859-1 with "\" escapes)
+# This file should be translated.
+
+# "featureName" property - name of the feature
+featureName =OSBP GridSource DSL 
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse OSBP
+
+# "description" property - description of the feature
+description=Contains the GridSource DSL for the OSBP InfoGrid
+
+# "updateSiteName" property - label for the update site
+updateSiteName=
+
+# "copyright" property - text of the "Feature Update Copyright"
+copyright=\
+Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) \n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+################ end of copyright property ####################################
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+February 1, 2011\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.osbp.xtext.gridsource.feature/feature.xml b/org.eclipse.osbp.xtext.gridsource.feature/feature.xml
new file mode 100644
index 0000000..213c6cd
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.feature/feature.xml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--#======================================================================= -->
+<!--# Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) -->
+<!--# All rights reserved. This program and the accompanying materials -->
+<!--# are made available under the terms of the Eclipse Public License v1.0 -->
+<!--# which accompanies this distribution, and is available at -->
+<!--# http://www.eclipse.org/legal/epl-v10.html -->
+<!--# -->
+<!--# Contributors: -->
+<!--#     Christophe Loetz (Loetz GmbH&Co.KG) - initial API and implementation -->
+<!--#======================================================================= -->
+
+<feature
+        id="org.eclipse.osbp.xtext.gridsource.feature"
+        label="%featureName"
+        version="0.9.0.qualifier"
+        provider-name="%providerName">
+        
+    <description>
+        %description
+    </description>
+        
+    <copyright>
+        %copyright
+    </copyright>
+        
+    <license url="%licenseURL">
+        %license
+    </license>
+        
+    <plugin
+        id="org.eclipse.osbp.xtext.gridsource"
+        download-size="0"
+        install-size="0"
+        version="0.0.0"
+        unpack="false"/>
+        
+    <plugin
+        id="org.eclipse.osbp.xtext.gridsource.tests"
+        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"
+        version="0.0.0"
+        unpack="false"/>
+        
+</feature>
diff --git a/org.eclipse.osbp.xtext.gridsource.feature/license.html b/org.eclipse.osbp.xtext.gridsource.feature/license.html
new file mode 100644
index 0000000..6e579a5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.feature/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.feature/pom.xml b/org.eclipse.osbp.xtext.gridsource.feature/pom.xml
new file mode 100644
index 0000000..a6766d1
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.feature/pom.xml
@@ -0,0 +1,76 @@
+<?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 implementation 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/maven-v4_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.feature</artifactId>
+    <packaging>eclipse-feature</packaging>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.eclipse.tycho.extras</groupId>
+                <artifactId>tycho-source-feature-plugin</artifactId>
+                <version>${tycho-version}</version>
+                <executions>
+                    <execution>
+                        <id>source-feature</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>source-feature</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <labelSuffix> (source)</labelSuffix>
+                    <excludes>
+                    </excludes>
+                </configuration>
+            </plugin>
+            <plugin>
+                <!-- workaround while bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=398250 
+					is not fixed -->
+                <groupId>org.eclipse.tycho</groupId>
+                <artifactId>tycho-p2-plugin</artifactId>
+                <version>${tycho-version}</version>
+                <executions>
+                    <execution>
+                        <id>attached-p2-metadata</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>p2-metadata</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+			<plugin>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>javadoc-jar</id>
+						<phase>package</phase>
+						<goals>
+							<goal>jar</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/org.eclipse.osbp.xtext.gridsource.feature/src/main/javadoc/README.txt b/org.eclipse.osbp.xtext.gridsource.feature/src/main/javadoc/README.txt
new file mode 100644
index 0000000..831da7e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.feature/src/main/javadoc/README.txt
@@ -0,0 +1 @@
+Resource folder for javadoc resources.
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.gridsource.feature/src/overview.html b/org.eclipse.osbp.xtext.gridsource.feature/src/overview.html
new file mode 100644
index 0000000..15c2224
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.feature/src/overview.html
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+	<title>OSBP Tools Graphical Entity</title>
+</head>
+<body>
+<p>The <strong>OSBP&nbsp;Xtext&nbsp;Gridsource DSL</strong> contains methods for the&nbsp;gridsource DSL.</p>
+
+<p>&nbsp;</p>
+</body>
+</html>
diff --git a/org.eclipse.osbp.xtext.gridsource.tests/.project b/org.eclipse.osbp.xtext.gridsource.tests/.project
new file mode 100644
index 0000000..dd5336d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/.project
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osbp.xtext.gridsource.tests</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.tests/LICENSE.txt b/org.eclipse.osbp.xtext.gridsource.tests/LICENSE.txt
new file mode 100644
index 0000000..ff42ad4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/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.tests/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.gridsource.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a9b4615
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.osbp.xtext.gridsource.tests
+Bundle-Vendor: Eclipse OSBP
+Bundle-Version: 0.9.0.qualifier
+Bundle-SymbolicName: org.eclipse.osbp.xtext.gridsource.tests;singleton:=true
+Bundle-ActivationPolicy: lazy
+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.ui.workbench;resolution:=optional,
+ org.objectweb.asm;bundle-version="[5.0.1,6.0.0)";resolution:=optional
+Import-Package: org.apache.log4j,
+ org.junit;version="4.5.0",
+ org.junit.runner;version="4.5.0",
+ org.junit.runner.manipulation;version="4.5.0",
+ org.junit.runner.notification;version="4.5.0",
+ org.junit.runners;version="4.5.0",
+ org.junit.runners.model;version="4.5.0",
+ org.hamcrest.core
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osbp.xtext.gridsource;version="0.9.0"
diff --git a/org.eclipse.osbp.xtext.gridsource.tests/about.html b/org.eclipse.osbp.xtext.gridsource.tests/about.html
new file mode 100644
index 0000000..64c0598
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/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.tests/about.ini b/org.eclipse.osbp.xtext.gridsource.tests/about.ini
new file mode 100644
index 0000000..7df671f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/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.tests/about.mappings b/org.eclipse.osbp.xtext.gridsource.tests/about.mappings
new file mode 100644
index 0000000..4511a0a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/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.tests/about.properties b/org.eclipse.osbp.xtext.gridsource.tests/about.properties
new file mode 100644
index 0000000..adc87d5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/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.tests
+
+################ 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.tests/build.properties b/org.eclipse.osbp.xtext.gridsource.tests/build.properties
new file mode 100644
index 0000000..28117ab
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/build.properties
@@ -0,0 +1,12 @@
+source.. = src/,\
+          src-gen/,\
+          xtend-gen/
+bin.includes = about.properties,  about.mappings,  about.ini,  about.html,  META-INF/,\
+       .,\
+               license.html,\
+               LICENSE.txt,\
+               epl-v10.html
+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.tests/epl-v10.html b/org.eclipse.osbp.xtext.gridsource.tests/epl-v10.html
new file mode 100644
index 0000000..b398acc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/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.tests/license.html b/org.eclipse.osbp.xtext.gridsource.tests/license.html
new file mode 100644
index 0000000..6e579a5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/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.tests/org.eclipse.osbp.xtext.gridsource.tests.launch b/org.eclipse.osbp.xtext.gridsource.tests/org.eclipse.osbp.xtext.gridsource.tests.launch
new file mode 100644
index 0000000..53b21d6
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/org.eclipse.osbp.xtext.gridsource.tests.launch
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.jdt.junit.launchconfig">
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.osbp.xtext.gridsource.tests"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value="=org.eclipse.osbp.xtext.gridsource.tests"/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<stringAttribute key="org.eclipse.jdt.launching.CLASSPATH_PROVIDER" value="org.eclipse.m2e.launchconfig.classpathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.osbp.xtext.gridsource.tests"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.m2e.launchconfig.sourcepathProvider"/>
+</launchConfiguration>
diff --git a/org.eclipse.osbp.xtext.gridsource.tests/pom.xml b/org.eclipse.osbp.xtext.gridsource.tests/pom.xml
new file mode 100644
index 0000000..ca7441a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/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.tests</artifactId>
+    <build>
+        <sourceDirectory>src</sourceDirectory>
+        <plugins>
+        </plugins>
+    </build>
+    <packaging>eclipse-plugin</packaging>
+
+</project>
diff --git a/org.eclipse.osbp.xtext.gridsource.tests/src-gen/org/eclipse/osbp/xtext/gridsource/GridSourceInjectorProvider.java b/org.eclipse.osbp.xtext.gridsource.tests/src-gen/org/eclipse/osbp/xtext/gridsource/GridSourceInjectorProvider.java
new file mode 100644
index 0000000..fd7ea9b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/src-gen/org/eclipse/osbp/xtext/gridsource/GridSourceInjectorProvider.java
@@ -0,0 +1,55 @@
+/**
+ *                                                                            
+ *  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;
+
+import org.eclipse.xtext.junit4.GlobalRegistries;
+import org.eclipse.xtext.junit4.GlobalRegistries.GlobalStateMemento;
+import org.eclipse.xtext.junit4.IInjectorProvider;
+import org.eclipse.xtext.junit4.IRegistryConfigurator;
+
+import com.google.inject.Injector;
+
+public class GridSourceInjectorProvider implements IInjectorProvider, IRegistryConfigurator {
+	
+    protected GlobalStateMemento stateBeforeInjectorCreation;
+	protected GlobalStateMemento stateAfterInjectorCreation;
+	protected Injector injector;
+
+	static {
+		GlobalRegistries.initializeDefaults();
+	}
+
+	public Injector getInjector()
+	{
+		if (injector == null) {
+			stateBeforeInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
+			this.injector = internalCreateInjector();
+			stateAfterInjectorCreation = GlobalRegistries.makeCopyOfGlobalState();
+		}
+		return injector;
+	}
+	
+	protected Injector internalCreateInjector() {
+	    return new GridSourceStandaloneSetup().createInjectorAndDoEMFRegistration();
+	}
+
+	public void restoreRegistry() {
+		stateBeforeInjectorCreation.restoreGlobalState();
+	}
+
+	public void setupRegistry() {
+		getInjector();
+		stateAfterInjectorCreation.restoreGlobalState();
+	}
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.tests/src-gen/org/eclipse/osbp/xtext/gridsource/GridSourceUiInjectorProvider.java b/org.eclipse.osbp.xtext.gridsource.tests/src-gen/org/eclipse/osbp/xtext/gridsource/GridSourceUiInjectorProvider.java
new file mode 100644
index 0000000..fbe5345
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.tests/src-gen/org/eclipse/osbp/xtext/gridsource/GridSourceUiInjectorProvider.java
@@ -0,0 +1,26 @@
+/**
+ *                                                                            
+ *  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;
+
+import org.eclipse.xtext.junit4.IInjectorProvider;
+
+import com.google.inject.Injector;
+
+public class GridSourceUiInjectorProvider implements IInjectorProvider {
+	
+	public Injector getInjector() {
+		return org.eclipse.osbp.xtext.gridsource.ui.internal.GridSourceActivator.getInstance().getInjector("org.eclipse.osbp.xtext.gridsource.GridSource");
+	}
+	
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/.project b/org.eclipse.osbp.xtext.gridsource.ui/.project
new file mode 100644
index 0000000..6c85c25
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/.project
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osbp.xtext.gridsource.ui</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.ui/LICENSE.txt b/org.eclipse.osbp.xtext.gridsource.ui/LICENSE.txt
new file mode 100644
index 0000000..ff42ad4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/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.ui/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.gridsource.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..7705496
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,31 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.osbp.xtext.gridsource.ui
+Bundle-Vendor: Eclipse OSBP
+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)",
+ 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.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.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.compare,
+ org.eclipse.osbp.infogrid.model;bundle-version="[0.9.0,0.10.0)",
+ org.eclipse.osbp.xtext.basic.ui
+Import-Package: org.apache.log4j,
+ org.eclipse.osbp.utils.constants;version="0.9.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: 
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/about.html b/org.eclipse.osbp.xtext.gridsource.ui/about.html
new file mode 100644
index 0000000..64c0598
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/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.ui/about.ini b/org.eclipse.osbp.xtext.gridsource.ui/about.ini
new file mode 100644
index 0000000..7df671f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/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.ui/about.mappings b/org.eclipse.osbp.xtext.gridsource.ui/about.mappings
new file mode 100644
index 0000000..4511a0a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/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.ui/about.properties b/org.eclipse.osbp.xtext.gridsource.ui/about.properties
new file mode 100644
index 0000000..047639c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/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.ui/build.properties b/org.eclipse.osbp.xtext.gridsource.ui/build.properties
new file mode 100644
index 0000000..b6bf9e2
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/build.properties
@@ -0,0 +1,15 @@
+source.. = src/,\
+          src-gen/,\
+          xtend-gen/
+bin.includes = about.properties,  about.mappings,  about.ini,  about.html,  META-INF/,\
+               .,\
+               plugin.xml,\
+               icons/,\
+               license.html,\
+               LICENSE.txt,\
+               epl-v10.html,\
+               i18n/
+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.ui/epl-v10.html b/org.eclipse.osbp.xtext.gridsource.ui/epl-v10.html
new file mode 100644
index 0000000..b398acc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/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.ui/i18n/I18N.properties b/org.eclipse.osbp.xtext.gridsource.ui/i18n/I18N.properties
new file mode 100644
index 0000000..04b5ad4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/i18n/I18N.properties
@@ -0,0 +1,62 @@
+#default
+org.eclipse.osbp.infogrid.model.gridsource.CxGridProperty=A grid property define different styles.
+org.eclipse.osbp.infogrid.model.gridsource.CxGridProperty.editable=Marks the propery as editable
+org.eclipse.osbp.infogrid.model.gridsource.CxGridProperty.prop=Starts a new property definition
+org.eclipse.osbp.infogrid.model.gridsource.CxGridProperty.style=Style defines how the property is visualized
+org.eclipse.osbp.infogrid.model.gridsource.CxGridNestedPath=A nested path
+org.eclipse.osbp.infogrid.model.gridsource.CxGridNestedPath..=Select a nested property
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropBooleanStyle=Boolean style
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropBooleanStyle.boolStyle=Shows the value of the property as a checkbox
+
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropButtonStyle=Button style
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropButtonStyle.buttonStyle=Shows the value of the property as a button caption
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropButtonStyle.eventTopic=An event is published under this topic if the button was pressed
+
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropDateStyle=Date style
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropDateStyle.dateStyle=Shows the value of the property formated as date
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropDateStyle.format=A date format to be used
+
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropHtmlStyle=Html style
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropHtmlStyle.htmlStyle=Shows the value of the property as rendered html
+
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropImageStyle=Image style
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropImageStyle.imageStyle=Shows the value of the property as an image
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropImageStyle.eventTopic=An event is published under this topic if the image was clicked
+
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropIndicatorStyle=Indicator style
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropIndicatorStyle.indicatorStyle=Shows the value of the property as an indicator. Red means below value_lower. Green means above value_upper.
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropIndicatorStyle.greenFrom=The indicator shows green if the value is greater then the value specified here
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropIndicatorStyle.redUnitl=The indicator shows red until the value is greater then the value specified here 
+
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropNumberStyle=Number style
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropNumberStyle.numberStyle=Shows the value of the property as a formated number
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropNumberStyle.format=Define a number format to be used. See following content assist.
+
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropPriceStyle=Price style
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropPriceStyle.priceStyle=Shows the value of the property as a price. Allows adding amount and currency
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropPriceStyle.value=A nested field from the property to represent the value
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropPriceStyle.format=Define a number format to be used. See following content assist.
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropPriceStyle.currency=A nested field from the property to represent the currency
+
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropProgressbarStyle=Progressbar style
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropProgressbarStyle.progressbarStyle=Shows the value of the property as a progressbar
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropProgressbarStyle.max=The maximum value expected
+
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropQuantityStyle=Quantity style
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropQuantityStyle.quantityStyle=Shows the value of the property as a quantity. Allows adding amount and uom
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropQuantityStyle.value=A nested field from the property to represent the value
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropQuantityStyle.format=Define a number format to be used. See following content assist.
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropQuantityStyle.uom=A nested field from the property to represent the unit of measure
+
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropTextStyle=Text style
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropTextStyle.textStyle=Shows the value of the property as a text
+
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridStyleConfigNumericToResource=Style config for numeric to resource
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridStyleConfigNumericToResource.number=The input value for this compare is numeric
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridStyleConfigNumericToResource.then=If compare returns OK, then the following image is used
+
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridStyleConfigStringToResource=Style config for string to resource
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridStyleConfigStringToResource.string=The input value for this compare is a String
+org.eclipse.osbp.infogrid.model.gridsource.style.CxGridStyleConfigStringToResource.then=If compare returns OK, then the following image is used
+
+
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/icons/CxGridProperty.png b/org.eclipse.osbp.xtext.gridsource.ui/icons/CxGridProperty.png
new file mode 100644
index 0000000..5c0b70f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/icons/CxGridProperty.png
Binary files differ
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/icons/CxGridSourceInput.png b/org.eclipse.osbp.xtext.gridsource.ui/icons/CxGridSourceInput.png
new file mode 100644
index 0000000..50dcc21
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/icons/CxGridSourceInput.png
Binary files differ
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/icons/GridSource.png b/org.eclipse.osbp.xtext.gridsource.ui/icons/GridSource.png
new file mode 100644
index 0000000..b432924
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/icons/GridSource.png
Binary files differ
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/license.html b/org.eclipse.osbp.xtext.gridsource.ui/license.html
new file mode 100644
index 0000000..6e579a5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/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.ui/plugin.xml b/org.eclipse.osbp.xtext.gridsource.ui/plugin.xml
new file mode 100644
index 0000000..b94db8f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/plugin.xml
@@ -0,0 +1,398 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<plugin>
+
+    <extension
+            point="org.eclipse.ui.editors">
+        <editor
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.XtextEditor"
+            contributorClass="org.eclipse.ui.editors.text.TextEditorActionContributor"
+            default="true"
+            extensions="gridsource"
+            id="org.eclipse.osbp.xtext.gridsource.GridSource"
+            name="OSBP GridSource Editor">
+        </editor>
+    </extension>
+    <extension
+        point="org.eclipse.ui.handlers">
+        <handler
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclarationHandler"
+            commandId="org.eclipse.xtext.ui.editor.hyperlinking.OpenDeclaration">
+            <activeWhen>
+                <reference
+                    definitionId="org.eclipse.osbp.xtext.gridsource.GridSource.Editor.opened">
+                </reference>
+            </activeWhen>
+        </handler>
+        <handler
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.handler.ValidateActionHandler"
+            commandId="org.eclipse.osbp.xtext.gridsource.GridSource.validate">
+         <activeWhen>
+            <reference
+                    definitionId="org.eclipse.osbp.xtext.gridsource.GridSource.Editor.opened">
+            </reference>
+         </activeWhen>
+      	</handler>
+      	<!-- copy qualified name -->
+        <handler
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedNameHandler"
+            commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName">
+            <activeWhen>
+				<reference definitionId="org.eclipse.osbp.xtext.gridsource.GridSource.Editor.opened" />
+            </activeWhen>
+        </handler>
+        <handler
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedNameHandler"
+            commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName">
+            <activeWhen>
+            	<and>
+            		<reference definitionId="org.eclipse.osbp.xtext.gridsource.GridSource.XtextEditor.opened" />
+	                <iterate>
+						<adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
+					</iterate>
+				</and>
+            </activeWhen>
+        </handler>
+    </extension>
+    <extension point="org.eclipse.core.expressions.definitions">
+        <definition id="org.eclipse.osbp.xtext.gridsource.GridSource.Editor.opened">
+            <and>
+                <reference definitionId="isActiveEditorAnInstanceOfXtextEditor"/>
+                <with variable="activeEditor">
+                    <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+                        value="org.eclipse.osbp.xtext.gridsource.GridSource" 
+                        forcePluginActivation="true"/>
+                </with>        
+            </and>
+        </definition>
+        <definition id="org.eclipse.osbp.xtext.gridsource.GridSource.XtextEditor.opened">
+            <and>
+                <reference definitionId="isXtextEditorActive"/>
+                <with variable="activeEditor">
+                    <test property="org.eclipse.xtext.ui.editor.XtextEditor.languageName" 
+                        value="org.eclipse.osbp.xtext.gridsource.GridSource" 
+                        forcePluginActivation="true"/>
+                </with>        
+            </and>
+        </definition>
+    </extension>
+    <extension
+            point="org.eclipse.ui.preferencePages">
+        <page
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+            id="org.eclipse.osbp.xtext.gridsource.GridSource"
+            name="OSBP GridSource">
+            <keywordReference id="org.eclipse.osbp.xtext.gridsource.ui.keyword_GridSource"/>
+        </page>
+        <page
+            category="org.eclipse.osbp.xtext.gridsource.GridSource"
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.syntaxcoloring.SyntaxColoringPreferencePage"
+            id="org.eclipse.osbp.xtext.gridsource.GridSource.coloring"
+            name="Syntax Coloring">
+            <keywordReference id="org.eclipse.osbp.xtext.gridsource.ui.keyword_GridSource"/>
+        </page>
+        <page
+            category="org.eclipse.osbp.xtext.gridsource.GridSource"
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.templates.XtextTemplatePreferencePage"
+            id="org.eclipse.osbp.xtext.gridsource.GridSource.templates"
+            name="Templates">
+            <keywordReference id="org.eclipse.osbp.xtext.gridsource.ui.keyword_GridSource"/>
+        </page>
+    </extension>
+    <extension
+            point="org.eclipse.ui.propertyPages">
+        <page
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.preferences.LanguageRootPreferencePage"
+            id="org.eclipse.osbp.xtext.gridsource.GridSource"
+            name="GridSource">
+            <keywordReference id="org.eclipse.osbp.xtext.gridsource.ui.keyword_GridSource"/>
+            <enabledWhen>
+	            <adapt type="org.eclipse.core.resources.IProject"/>
+			</enabledWhen>
+	        <filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+        </page>
+    </extension>
+    <extension
+        point="org.eclipse.ui.keywords">
+        <keyword
+            id="org.eclipse.osbp.xtext.gridsource.ui.keyword_GridSource"
+            label="GridSource"/>
+    </extension>
+    <extension
+         point="org.eclipse.ui.commands">
+      <command
+            description="Trigger expensive validation"
+            id="org.eclipse.osbp.xtext.gridsource.GridSource.validate"
+            name="Validate">
+      </command>
+      <!-- copy qualified name -->
+      <command
+            id="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+            categoryId="org.eclipse.ui.category.edit"
+            description="Copy the qualified name for the selected element"
+            name="Copy Qualified Name">
+      </command>
+      <command
+            id="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName"
+            categoryId="org.eclipse.ui.category.edit"
+            description="Copy the qualified name for the selected element"
+            name="Copy Qualified Name">
+      </command>
+    </extension>
+    <extension point="org.eclipse.ui.menus">
+        <menuContribution
+            locationURI="popup:#TextEditorContext?after=group.edit">
+             <command
+                 commandId="org.eclipse.osbp.xtext.gridsource.GridSource.validate"
+                 style="push"
+                 tooltip="Trigger expensive validation">
+            <visibleWhen checkEnabled="false">
+                <reference
+                    definitionId="org.eclipse.osbp.xtext.gridsource.GridSource.Editor.opened">
+                </reference>
+            </visibleWhen>
+         </command>  
+         </menuContribution>
+         <!-- copy qualified name -->
+         <menuContribution locationURI="popup:#TextEditorContext?after=copy">
+         	<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName" 
+         		style="push" tooltip="Copy Qualified Name">
+            	<visibleWhen checkEnabled="false">
+                	<reference definitionId="org.eclipse.osbp.xtext.gridsource.GridSource.Editor.opened" />
+            	</visibleWhen>
+         	</command>  
+         </menuContribution>
+         <menuContribution locationURI="menu:edit?after=copy">
+         	<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.EditorCopyQualifiedName"
+            	style="push" tooltip="Copy Qualified Name">
+            	<visibleWhen checkEnabled="false">
+                	<reference definitionId="org.eclipse.osbp.xtext.gridsource.GridSource.Editor.opened" />
+            	</visibleWhen>
+         	</command>  
+         </menuContribution>
+         <menuContribution locationURI="popup:org.eclipse.xtext.ui.outline?after=additions">
+			<command commandId="org.eclipse.xtext.ui.editor.copyqualifiedname.OutlineCopyQualifiedName" 
+				style="push" tooltip="Copy Qualified Name">
+         		<visibleWhen checkEnabled="false">
+	            	<and>
+	            		<reference definitionId="org.eclipse.osbp.xtext.gridsource.GridSource.XtextEditor.opened" />
+						<iterate>
+							<adapt type="org.eclipse.xtext.ui.editor.outline.IOutlineNode" />
+						</iterate>
+					</and>
+				</visibleWhen>
+			</command>
+         </menuContribution>
+    </extension>
+    <extension point="org.eclipse.ui.menus">
+		<menuContribution locationURI="popup:#TextEditorContext?endof=group.find">
+			<command commandId="org.eclipse.xtext.ui.editor.FindReferences">
+				<visibleWhen checkEnabled="false">
+                	<reference definitionId="org.eclipse.osbp.xtext.gridsource.GridSource.Editor.opened">
+                	</reference>
+            	</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+	    <handler
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.findrefs.FindReferencesHandler"
+            commandId="org.eclipse.xtext.ui.editor.FindReferences">
+            <activeWhen>
+                <reference
+                    definitionId="org.eclipse.osbp.xtext.gridsource.GridSource.Editor.opened">
+                </reference>
+            </activeWhen>
+        </handler>
+    </extension>   
+
+<!-- adding resource factories -->
+
+	<extension
+		point="org.eclipse.emf.ecore.extension_parser">
+		<parser
+			class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.resource.IResourceFactory"
+			type="gridsource">
+		</parser>
+	</extension>
+	<extension point="org.eclipse.xtext.extension_resourceServiceProvider">
+        <resourceServiceProvider
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.resource.IResourceUIServiceProvider"
+            uriExtension="gridsource">
+        </resourceServiceProvider>
+    </extension>
+
+
+	<!-- marker definitions for org.eclipse.osbp.xtext.gridsource.GridSource -->
+	<extension
+	        id="gridsource.check.fast"
+	        name="GridSource Problem"
+	        point="org.eclipse.core.resources.markers">
+	    <super type="org.eclipse.xtext.ui.check.fast"/>
+	    <persistent value="true"/>
+	</extension>
+	<extension
+	        id="gridsource.check.normal"
+	        name="GridSource Problem"
+	        point="org.eclipse.core.resources.markers">
+	    <super type="org.eclipse.xtext.ui.check.normal"/>
+	    <persistent value="true"/>
+	</extension>
+	<extension
+	        id="gridsource.check.expensive"
+	        name="GridSource Problem"
+	        point="org.eclipse.core.resources.markers">
+	    <super type="org.eclipse.xtext.ui.check.expensive"/>
+	    <persistent value="true"/>
+	</extension>
+
+   <extension
+         point="org.eclipse.xtext.builder.participant">
+      <participant
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.builder.IXtextBuilderParticipant"
+            fileExtensions="gridsource"
+            >
+      </participant>
+   </extension>
+   <extension
+            point="org.eclipse.ui.preferencePages">
+        <page
+            category="org.eclipse.osbp.xtext.gridsource.GridSource"
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+            id="org.eclipse.osbp.xtext.gridsource.GridSource.compiler.preferencePage"
+            name="Compiler">
+            <keywordReference id="org.eclipse.osbp.xtext.gridsource.ui.keyword_GridSource"/>
+        </page>
+    </extension>
+    <extension
+            point="org.eclipse.ui.propertyPages">
+        <page
+            category="org.eclipse.osbp.xtext.gridsource.GridSource"
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.builder.preferences.BuilderPreferencePage"
+            id="org.eclipse.osbp.xtext.gridsource.GridSource.compiler.propertyPage"
+            name="Compiler">
+            <keywordReference id="org.eclipse.osbp.xtext.gridsource.ui.keyword_GridSource"/>
+            <enabledWhen>
+	            <adapt type="org.eclipse.core.resources.IProject"/>
+			</enabledWhen>
+	        <filter name="projectNature" value="org.eclipse.xtext.ui.shared.xtextNature"/>
+        </page>
+    </extension>
+
+	<!-- Quick Outline -->
+	<extension
+		point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.outline.quickoutline.ShowQuickOutlineActionHandler"
+			commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.xtext.gridsource.GridSource.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+	<extension
+		point="org.eclipse.ui.commands">
+		<command
+			description="Open the quick outline."
+			id="org.eclipse.xtext.ui.editor.outline.QuickOutline"
+			name="Quick Outline">
+		</command>
+	</extension>
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+			locationURI="popup:#TextEditorContext?after=group.open">
+			<command commandId="org.eclipse.xtext.ui.editor.outline.QuickOutline"
+				style="push"
+				tooltip="Open Quick Outline">
+				<visibleWhen checkEnabled="false">
+					<reference definitionId="org.eclipse.osbp.xtext.gridsource.GridSource.Editor.opened"/>
+				</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+    <!-- quickfix marker resolution generator for org.eclipse.osbp.xtext.gridsource.GridSource -->
+    <extension
+            point="org.eclipse.ui.ide.markerResolution">
+        <markerResolutionGenerator
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+            markerType="org.eclipse.osbp.xtext.gridsource.ui.gridsource.check.fast">
+            <attribute
+                name="FIXABLE_KEY"
+                value="true">
+            </attribute>
+        </markerResolutionGenerator>
+        <markerResolutionGenerator
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+            markerType="org.eclipse.osbp.xtext.gridsource.ui.gridsource.check.normal">
+            <attribute
+                name="FIXABLE_KEY"
+                value="true">
+            </attribute>
+        </markerResolutionGenerator>
+        <markerResolutionGenerator
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.quickfix.MarkerResolutionGenerator"
+            markerType="org.eclipse.osbp.xtext.gridsource.ui.gridsource.check.expensive">
+            <attribute
+                name="FIXABLE_KEY"
+                value="true">
+            </attribute>
+        </markerResolutionGenerator>
+    </extension>
+   	<!-- Rename Refactoring -->
+	<extension point="org.eclipse.ui.handlers">
+		<handler 
+			class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.DefaultRenameElementHandler"
+			commandId="org.eclipse.xtext.ui.refactoring.RenameElement">
+			<activeWhen>
+				<reference
+					definitionId="org.eclipse.osbp.xtext.gridsource.GridSource.Editor.opened">
+				</reference>
+			</activeWhen>
+		</handler>
+	</extension>
+    <extension point="org.eclipse.ui.menus">
+         <menuContribution
+            locationURI="popup:#TextEditorContext?after=group.edit">
+         <command commandId="org.eclipse.xtext.ui.refactoring.RenameElement"
+               style="push">
+            <visibleWhen checkEnabled="false">
+               <reference
+                     definitionId="org.eclipse.osbp.xtext.gridsource.GridSource.Editor.opened">
+               </reference>
+            </visibleWhen>
+         </command>
+      </menuContribution>
+   </extension>
+   <extension point="org.eclipse.ui.preferencePages">
+	    <page
+	        category="org.eclipse.osbp.xtext.gridsource.GridSource"
+	        class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.refactoring.ui.RefactoringPreferencePage"
+	        id="org.eclipse.osbp.xtext.gridsource.GridSource.refactoring"
+	        name="Refactoring">
+	        <keywordReference id="org.eclipse.osbp.xtext.gridsource.ui.keyword_GridSource"/>
+	    </page>
+	</extension>
+
+  <extension point="org.eclipse.compare.contentViewers">
+    <viewer id="org.eclipse.osbp.xtext.gridsource.GridSource.compare.contentViewers"
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+            extensions="gridsource">
+    </viewer>
+  </extension>
+  <extension point="org.eclipse.compare.contentMergeViewers">
+    <viewer id="org.eclipse.osbp.xtext.gridsource.GridSource.compare.contentMergeViewers"
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
+            extensions="gridsource" label="GridSource Compare">
+     </viewer>
+  </extension>
+  <extension point="org.eclipse.ui.editors.documentProviders">
+    <provider id="org.eclipse.osbp.xtext.gridsource.GridSource.editors.documentProviders"
+            class="org.eclipse.osbp.xtext.gridsource.ui.GridSourceExecutableExtensionFactory:org.eclipse.xtext.ui.editor.model.XtextDocumentProvider"
+            extensions="gridsource">
+    </provider>
+  </extension>
+
+</plugin>
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/pom.xml b/org.eclipse.osbp.xtext.gridsource.ui/pom.xml
new file mode 100644
index 0000000..1c84dad
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/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.ui</artifactId>
+    <build>
+        <sourceDirectory>src</sourceDirectory>
+        <plugins>
+        </plugins>
+    </build>
+    <packaging>eclipse-plugin</packaging>
+
+</project>
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
new file mode 100644
index 0000000..dededa6
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/AbstractGridSourceUiModule.java
@@ -0,0 +1,251 @@
+/**
+ *                                                                            
+ *  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;
+
+import org.eclipse.xtext.ui.DefaultUiModule;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * Manual modifications go to {org.eclipse.osbp.xtext.gridsource.ui.GridSourceUiModule}
+ */
+@SuppressWarnings("all")
+public abstract class AbstractGridSourceUiModule extends DefaultUiModule {
+	
+	public AbstractGridSourceUiModule(AbstractUIPlugin plugin) {
+		super(plugin);
+	}
+	
+	
+	// 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.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.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.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.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.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.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.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.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.generator.generator.GeneratorFragment
+	public Class<? extends org.eclipse.xtext.builder.IXtextBuilderParticipant> bindIXtextBuilderParticipant() {
+		return org.eclipse.xtext.builder.BuilderParticipant.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.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.generator.types.TypesGeneratorFragment
+	public java.lang.ClassLoader bindClassLoaderToInstance() {
+		return getClass().getClassLoader();
+	}
+
+	// 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.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.generator.types.TypesGeneratorFragment
+	public Class<? extends org.eclipse.xtext.common.types.xtext.ui.ITypesProposalProvider> bindITypesProposalProvider() {
+		return org.eclipse.xtext.common.types.xtext.ui.JdtTypesProposalProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
+	public Class<? extends org.eclipse.xtext.common.types.access.jdt.IJavaProjectProvider> bindIJavaProjectProvider() {
+		return org.eclipse.xtext.common.types.xtext.ui.XtextResourceSetBasedProjectProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.hyperlinking.IHyperlinkHelper> bindIHyperlinkHelper() {
+		return org.eclipse.xtext.common.types.xtext.ui.TypeAwareHyperlinkHelper.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.PrefixMatcher> bindPrefixMatcher() {
+		return org.eclipse.xtext.ui.editor.contentassist.FQNPrefixMatcher.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
+	public Class<? extends org.eclipse.xtext.ui.editor.contentassist.AbstractJavaBasedContentProposalProvider.ReferenceProposalCreator> bindAbstractJavaBasedContentProposalProvider$ReferenceProposalCreator() {
+		return org.eclipse.xtext.common.types.xtext.ui.TypeAwareReferenceProposalCreator.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
new file mode 100644
index 0000000..d9a802d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/GridSourceExecutableExtensionFactory.java
@@ -0,0 +1,39 @@
+/**
+ *                                                                            
+ *  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;
+
+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. 
+ */
+public class GridSourceExecutableExtensionFactory extends AbstractGuiceAwareExecutableExtensionFactory {
+
+	@Override
+	protected Bundle getBundle() {
+		return GridSourceActivator.getInstance().getBundle();
+	}
+	
+	@Override
+	protected Injector getInjector() {
+		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
new file mode 100644
index 0000000..8d65353
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/AbstractGridSourceProposalProvider.java
@@ -0,0 +1,228 @@
+/**
+ *                                                                            
+ *  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;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor;
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext;
+
+/**
+ * Represents a generated, default implementation of superclass {@link org.eclipse.xtext.xbase.ui.contentassist.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 void completeSource_Id(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSource_RootType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSource_Inputs(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeSource_Properties(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInput_InputType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeInput_Filters(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEQFilter_RootTypePropertyPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeEQFilter_InputTypePropertyPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProperty_Path(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeProperty_Style(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeNestedField_Field(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeNestedField_Path(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeNestedPath_Field(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeNestedPath_Path(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePropertyButtonStyle_EventTopic(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePropertyDateStyle_DateFormat(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePropertyNumberStyle_NumberFormat(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePropertyProgressbarStyle_MaxValue(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeGridPropIndicatorStyle_GreenStarts(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeGridPropIndicatorStyle_RedEnds(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePropertyQuantityStyle_HtmlPattern(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePropertyQuantityStyle_ValuePropertyPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePropertyQuantityStyle_ValueNumberFormat(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePropertyQuantityStyle_UomPropertyPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePropertyPriceStyle_HtmlPattern(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePropertyPriceStyle_ValuePropertyPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePropertyPriceStyle_ValueNumberFormat(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePropertyPriceStyle_CurrencyPropertyPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePropertyImageStyle_EventTopic(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completePropertyImageStyle_Configs(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeNumericToResourceStyleConfig_Compare(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeNumericToResourceStyleConfig_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeNumericToResourceStyleConfig_ResourceThemePath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStringToResourceStyleConfig_Compare(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeStringToResourceStyleConfig_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	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
+	}
+	public void complete_Input(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EQFilter(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_Property(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_NestedField(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_NestedPath(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PropertyStyle(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PropertyButtonStyle(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PropertyHtmlStyle(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PropertyBooleanStyle(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PropertyDateStyle(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PropertyNumberStyle(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PropertyProgressbarStyle(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_GridPropIndicatorStyle(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PropertyQuantityStyle(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PropertyPriceStyle(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_PropertyTextStyle(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	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
+	}
+	public void complete_NumericToResourceStyleConfig(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_StringToResourceStyleConfig(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	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
+	}
+	public void complete_THEME_RESOURCE(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LInt(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_LDouble(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_EVENT_TOPIC(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/contentassist/antlr/GridSourceParser.java b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/GridSourceParser.java
new file mode 100644
index 0000000..518f2e9
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/GridSourceParser.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.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/PartialGridSourceContentAssistParser.java b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/PartialGridSourceContentAssistParser.java
new file mode 100644
index 0000000..32d57df
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/PartialGridSourceContentAssistParser.java
@@ -0,0 +1,48 @@
+/**
+ *                                                                            
+ *  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.Collections;
+
+import org.eclipse.xtext.AbstractRule;
+import org.eclipse.xtext.ui.codetemplates.ui.partialEditing.IPartialContentAssistParser;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.FollowElement;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.util.PolymorphicDispatcher;
+
+/**
+ * @author Sebastian Zarnekow - Initial contribution and API
+ */
+@SuppressWarnings("restriction")
+public class PartialGridSourceContentAssistParser extends GridSourceParser implements IPartialContentAssistParser {
+
+	private AbstractRule rule;
+
+	public void initializeFor(AbstractRule rule) {
+		this.rule = rule;
+	}
+	
+	@Override
+	protected Collection<FollowElement> getFollowElements(AbstractInternalContentAssistParser parser) {
+		if (rule == null || rule.eIsProxy())
+			return Collections.emptyList();
+		String methodName = "entryRule" + rule.getName();
+		PolymorphicDispatcher<Collection<FollowElement>> dispatcher = 
+			new PolymorphicDispatcher<Collection<FollowElement>>(methodName, 0, 0, Collections.singletonList(parser));
+		dispatcher.invoke();
+		return parser.getFollowElements();
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g
new file mode 100644
index 0000000..b464e6f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g
@@ -0,0 +1,8289 @@
+/**
+ *                                                                            
+ *  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
+ * 
+ */
+grammar InternalGridSource;
+
+options {
+	superClass=AbstractInternalContentAssistParser;
+	backtrack=true;
+	
+}
+
+@lexer::header {
+package org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.Lexer;
+}
+
+@parser::header {
+package org.eclipse.osbp.xtext.gridsource.ui.contentassist.antlr.internal; 
+
+import java.io.InputStream;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.DFA;
+import org.eclipse.osbp.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.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.tokens b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.tokens
new file mode 100644
index 0000000..8abefac
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/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.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSourceLexer.java b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSourceLexer.java
new file mode 100644
index 0000000..6a46f9a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSourceLexer.java
@@ -0,0 +1,3046 @@
+/**
+ *                                                                            
+ *  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.internal;
+
+// Hack: Use our own Lexer superclass by means of import. 
+// Currently there is no other way to specify the superclass for the lexer.
+import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.Lexer;
+
+
+import org.antlr.runtime.*;
+import java.util.Stack;
+import java.util.List;
+import java.util.ArrayList;
+
+@SuppressWarnings("all")
+public class 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 "../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:11:7: ( '+' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:12:7: ( '-' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:13:7: ( 'equal' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:14:7: ( 'greater equal' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:15:7: ( 'greater than' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:16:7: ( 'lower equal' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:17:7: ( 'lower than' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:18:7: ( 'not equal' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:19:7: ( 'gridsource' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:20:7: ( 'for' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:21:7: ( '{' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:22:7: ( 'inputs' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:23:7: ( '}' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:24:7: ( 'inputType' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:25:7: ( 'filters' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:26:7: ( '&&' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:27:7: ( 'root:' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:28:7: ( '=' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:29:7: ( 'input:' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:30:7: ( 'prop' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:31:7: ( 'style' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:32:7: ( '.' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:33:7: ( 'buttonStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:34:7: ( 'eventTopic' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:35:7: ( 'htmlStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:36:7: ( 'boolStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:37:7: ( 'dateStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:38:7: ( 'format' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:39:7: ( 'numberStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:40:7: ( 'progressbarStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:41:7: ( 'max' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:42:7: ( 'indicatorStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:43:7: ( 'greenFrom' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:44:7: ( 'redUntil' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:45:7: ( 'quantityStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:46:7: ( 'value' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:47:7: ( 'uom' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:48:7: ( '(' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:49:7: ( ')' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:50:7: ( 'priceStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:51:7: ( 'currency' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:52:7: ( 'textStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:53:7: ( 'imageStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:54:7: ( 'number' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:55:7: ( 'then' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:56:7: ( 'string' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:57:7: ( '[' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:58:7: ( ']' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:59:7: ( '=>' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:60:7: ( ',' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:61:7: ( '<' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:62:7: ( '>' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:63:7: ( '?' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:64:7: ( 'extends' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:65:7: ( '&' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:66:7: ( 'super' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:67:7: ( '*' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:68:7: ( 'import' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:69:7: ( ';' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:70:7: ( 'static' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:71:7: ( 'extension' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8261:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8261:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8261:11: ( '^' )?
+            int alt1=2;
+            int LA1_0 = input.LA(1);
+
+            if ( (LA1_0=='^') ) {
+                alt1=1;
+            }
+            switch (alt1) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8261:11: '^'
+                    {
+                    match('^'); 
+
+                    }
+                    break;
+
+            }
+
+            if ( input.LA(1)=='$'||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse = new MismatchedSetException(null,input);
+                recover(mse);
+                throw mse;}
+
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8261:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( (LA2_0=='$'||(LA2_0>='0' && LA2_0<='9')||(LA2_0>='A' && LA2_0<='Z')||LA2_0=='_'||(LA2_0>='a' && LA2_0<='z')) ) {
+                    alt2=1;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8263:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8263:12: '0' .. '9' ( '0' .. '9' | '_' )*
+            {
+            matchRange('0','9'); 
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8263: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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8265:21: ( 'theme:/' ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '.' | '/' | '0' .. '9' )* )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8265:23: 'theme:/' ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '.' | '/' | '0' .. '9' )*
+            {
+            match("theme:/"); 
+
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8265: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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8267:18: ( '\\'' RULE_ID ( '/' RULE_ID )* ( '/*' )? '\\'' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8267:20: '\\'' RULE_ID ( '/' RULE_ID )* ( '/*' )? '\\''
+            {
+            match('\''); 
+            mRULE_ID(); 
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8267: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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8267:34: '/' RULE_ID
+            	    {
+            	    match('/'); 
+            	    mRULE_ID(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop5;
+                }
+            } while (true);
+
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8267:48: ( '/*' )?
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+
+            if ( (LA6_0=='/') ) {
+                alt6=1;
+            }
+            switch (alt6) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8267: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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269: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 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
+                    {
+                    match('\"'); 
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269: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 :
+                    	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269:21: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269: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);
+
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269:44: ( '\"' )?
+                    int alt8=2;
+                    int LA8_0 = input.LA(1);
+
+                    if ( (LA8_0=='\"') ) {
+                        alt8=1;
+                    }
+                    switch (alt8) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269:44: '\"'
+                            {
+                            match('\"'); 
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
+                    {
+                    match('\''); 
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269: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 :
+                    	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269:55: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269: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);
+
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269:79: ( '\\'' )?
+                    int alt10=2;
+                    int LA10_0 = input.LA(1);
+
+                    if ( (LA10_0=='\'') ) {
+                        alt10=1;
+                    }
+                    switch (alt10) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8269:79: '\\''
+                            {
+                            match('\''); 
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_STRING"
+
+    // $ANTLR start "RULE_ML_COMMENT"
+    public final void mRULE_ML_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_ML_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8271:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8271:19: '/*' ( options {greedy=false; } : . )* '*/'
+            {
+            match("/*"); 
+
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8271: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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8271: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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8273:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8273:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            {
+            match("//"); 
+
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8273: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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8273: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);
+
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8273: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 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8273:41: ( '\\r' )? '\\n'
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8273:41: ( '\\r' )?
+                    int alt14=2;
+                    int LA14_0 = input.LA(1);
+
+                    if ( (LA14_0=='\r') ) {
+                        alt14=1;
+                    }
+                    switch (alt14) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8273:41: '\\r'
+                            {
+                            match('\r'); 
+
+                            }
+                            break;
+
+                    }
+
+                    match('\n'); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_SL_COMMENT"
+
+    // $ANTLR start "RULE_WS"
+    public final void mRULE_WS() throws RecognitionException {
+        try {
+            int _type = RULE_WS;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8275:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8275:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8275: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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8277:16: ( . )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:8277:18: .
+            {
+            matchAny(); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_ANY_OTHER"
+
+    public void mTokens() throws RecognitionException {
+        // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/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 )
+        int alt17=70;
+        alt17 = dfa17.predict(input);
+        switch (alt17) {
+            case 1 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:10: T__13
+                {
+                mT__13(); 
+
+                }
+                break;
+            case 2 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:16: T__14
+                {
+                mT__14(); 
+
+                }
+                break;
+            case 3 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:22: T__15
+                {
+                mT__15(); 
+
+                }
+                break;
+            case 4 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:28: T__16
+                {
+                mT__16(); 
+
+                }
+                break;
+            case 5 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:34: T__17
+                {
+                mT__17(); 
+
+                }
+                break;
+            case 6 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:40: T__18
+                {
+                mT__18(); 
+
+                }
+                break;
+            case 7 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:46: T__19
+                {
+                mT__19(); 
+
+                }
+                break;
+            case 8 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:52: T__20
+                {
+                mT__20(); 
+
+                }
+                break;
+            case 9 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:58: T__21
+                {
+                mT__21(); 
+
+                }
+                break;
+            case 10 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:64: T__22
+                {
+                mT__22(); 
+
+                }
+                break;
+            case 11 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:70: T__23
+                {
+                mT__23(); 
+
+                }
+                break;
+            case 12 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:76: T__24
+                {
+                mT__24(); 
+
+                }
+                break;
+            case 13 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:82: T__25
+                {
+                mT__25(); 
+
+                }
+                break;
+            case 14 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:88: T__26
+                {
+                mT__26(); 
+
+                }
+                break;
+            case 15 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:94: T__27
+                {
+                mT__27(); 
+
+                }
+                break;
+            case 16 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:100: T__28
+                {
+                mT__28(); 
+
+                }
+                break;
+            case 17 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:106: T__29
+                {
+                mT__29(); 
+
+                }
+                break;
+            case 18 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:112: T__30
+                {
+                mT__30(); 
+
+                }
+                break;
+            case 19 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:118: T__31
+                {
+                mT__31(); 
+
+                }
+                break;
+            case 20 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:124: T__32
+                {
+                mT__32(); 
+
+                }
+                break;
+            case 21 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:130: T__33
+                {
+                mT__33(); 
+
+                }
+                break;
+            case 22 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:136: T__34
+                {
+                mT__34(); 
+
+                }
+                break;
+            case 23 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:142: T__35
+                {
+                mT__35(); 
+
+                }
+                break;
+            case 24 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:148: T__36
+                {
+                mT__36(); 
+
+                }
+                break;
+            case 25 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:154: T__37
+                {
+                mT__37(); 
+
+                }
+                break;
+            case 26 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:160: T__38
+                {
+                mT__38(); 
+
+                }
+                break;
+            case 27 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:166: T__39
+                {
+                mT__39(); 
+
+                }
+                break;
+            case 28 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:172: T__40
+                {
+                mT__40(); 
+
+                }
+                break;
+            case 29 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:178: T__41
+                {
+                mT__41(); 
+
+                }
+                break;
+            case 30 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:184: T__42
+                {
+                mT__42(); 
+
+                }
+                break;
+            case 31 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:190: T__43
+                {
+                mT__43(); 
+
+                }
+                break;
+            case 32 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:196: T__44
+                {
+                mT__44(); 
+
+                }
+                break;
+            case 33 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:202: T__45
+                {
+                mT__45(); 
+
+                }
+                break;
+            case 34 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:208: T__46
+                {
+                mT__46(); 
+
+                }
+                break;
+            case 35 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:214: T__47
+                {
+                mT__47(); 
+
+                }
+                break;
+            case 36 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:220: T__48
+                {
+                mT__48(); 
+
+                }
+                break;
+            case 37 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:226: T__49
+                {
+                mT__49(); 
+
+                }
+                break;
+            case 38 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:232: T__50
+                {
+                mT__50(); 
+
+                }
+                break;
+            case 39 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:238: T__51
+                {
+                mT__51(); 
+
+                }
+                break;
+            case 40 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:244: T__52
+                {
+                mT__52(); 
+
+                }
+                break;
+            case 41 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:250: T__53
+                {
+                mT__53(); 
+
+                }
+                break;
+            case 42 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:256: T__54
+                {
+                mT__54(); 
+
+                }
+                break;
+            case 43 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:262: T__55
+                {
+                mT__55(); 
+
+                }
+                break;
+            case 44 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:268: T__56
+                {
+                mT__56(); 
+
+                }
+                break;
+            case 45 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:274: T__57
+                {
+                mT__57(); 
+
+                }
+                break;
+            case 46 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:280: T__58
+                {
+                mT__58(); 
+
+                }
+                break;
+            case 47 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:286: T__59
+                {
+                mT__59(); 
+
+                }
+                break;
+            case 48 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:292: T__60
+                {
+                mT__60(); 
+
+                }
+                break;
+            case 49 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:298: T__61
+                {
+                mT__61(); 
+
+                }
+                break;
+            case 50 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:304: T__62
+                {
+                mT__62(); 
+
+                }
+                break;
+            case 51 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:310: T__63
+                {
+                mT__63(); 
+
+                }
+                break;
+            case 52 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:316: T__64
+                {
+                mT__64(); 
+
+                }
+                break;
+            case 53 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:322: T__65
+                {
+                mT__65(); 
+
+                }
+                break;
+            case 54 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:328: T__66
+                {
+                mT__66(); 
+
+                }
+                break;
+            case 55 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:334: T__67
+                {
+                mT__67(); 
+
+                }
+                break;
+            case 56 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:340: T__68
+                {
+                mT__68(); 
+
+                }
+                break;
+            case 57 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:346: T__69
+                {
+                mT__69(); 
+
+                }
+                break;
+            case 58 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:352: T__70
+                {
+                mT__70(); 
+
+                }
+                break;
+            case 59 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:358: T__71
+                {
+                mT__71(); 
+
+                }
+                break;
+            case 60 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:364: T__72
+                {
+                mT__72(); 
+
+                }
+                break;
+            case 61 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:370: T__73
+                {
+                mT__73(); 
+
+                }
+                break;
+            case 62 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:376: RULE_ID
+                {
+                mRULE_ID(); 
+
+                }
+                break;
+            case 63 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:384: RULE_INT
+                {
+                mRULE_INT(); 
+
+                }
+                break;
+            case 64 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:393: RULE_THEME_RESOURCE
+                {
+                mRULE_THEME_RESOURCE(); 
+
+                }
+                break;
+            case 65 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:413: RULE_EVENT_TOPIC
+                {
+                mRULE_EVENT_TOPIC(); 
+
+                }
+                break;
+            case 66 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:430: RULE_STRING
+                {
+                mRULE_STRING(); 
+
+                }
+                break;
+            case 67 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:442: RULE_ML_COMMENT
+                {
+                mRULE_ML_COMMENT(); 
+
+                }
+                break;
+            case 68 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:458: RULE_SL_COMMENT
+                {
+                mRULE_SL_COMMENT(); 
+
+                }
+                break;
+            case 69 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1:474: RULE_WS
+                {
+                mRULE_WS(); 
+
+                }
+                break;
+            case 70 :
+                // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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;
+        }
+    }
+ 
+
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSourceParser.java b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSourceParser.java
new file mode 100644
index 0000000..56182ef
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSourceParser.java
@@ -0,0 +1,10014 @@
+/**
+ *                                                                            
+ *  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.internal; 
+
+import java.io.InputStream;
+import org.eclipse.xtext.*;
+import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.parser.impl.*;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.AbstractInternalContentAssistParser;
+import org.eclipse.xtext.ui.editor.contentassist.antlr.internal.DFA;
+import org.eclipse.osbp.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 "../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:61:1: entryRuleSource : ruleSource EOF ;
+    public final void entryRuleSource() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:62:1: ( ruleSource EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:63:1: ruleSource EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceRule()); 
+            }
+            pushFollow(FOLLOW_ruleSource_in_entryRuleSource67);
+            ruleSource();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getSourceRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleSource74); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleSource"
+
+
+    // $ANTLR start "ruleSource"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:70:1: ruleSource : ( ( rule__Source__Group__0 ) ) ;
+    public final void ruleSource() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:74:2: ( ( ( rule__Source__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:75:1: ( ( rule__Source__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:75:1: ( ( rule__Source__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:76:1: ( rule__Source__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:77:1: ( rule__Source__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:77:2: rule__Source__Group__0
+            {
+            pushFollow(FOLLOW_rule__Source__Group__0_in_ruleSource100);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:89:1: entryRuleInput : ruleInput EOF ;
+    public final void entryRuleInput() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:90:1: ( ruleInput EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:91:1: ruleInput EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputRule()); 
+            }
+            pushFollow(FOLLOW_ruleInput_in_entryRuleInput127);
+            ruleInput();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getInputRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleInput134); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleInput"
+
+
+    // $ANTLR start "ruleInput"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:98:1: ruleInput : ( ( rule__Input__Group__0 ) ) ;
+    public final void ruleInput() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:102:2: ( ( ( rule__Input__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:103:1: ( ( rule__Input__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:103:1: ( ( rule__Input__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:104:1: ( rule__Input__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:105:1: ( rule__Input__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:105:2: rule__Input__Group__0
+            {
+            pushFollow(FOLLOW_rule__Input__Group__0_in_ruleInput160);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:117:1: entryRuleEQFilter : ruleEQFilter EOF ;
+    public final void entryRuleEQFilter() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:118:1: ( ruleEQFilter EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:119:1: ruleEQFilter EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterRule()); 
+            }
+            pushFollow(FOLLOW_ruleEQFilter_in_entryRuleEQFilter187);
+            ruleEQFilter();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getEQFilterRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleEQFilter194); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleEQFilter"
+
+
+    // $ANTLR start "ruleEQFilter"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:126:1: ruleEQFilter : ( ( rule__EQFilter__Group__0 ) ) ;
+    public final void ruleEQFilter() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:130:2: ( ( ( rule__EQFilter__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:131:1: ( ( rule__EQFilter__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:131:1: ( ( rule__EQFilter__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:132:1: ( rule__EQFilter__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:133:1: ( rule__EQFilter__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:133:2: rule__EQFilter__Group__0
+            {
+            pushFollow(FOLLOW_rule__EQFilter__Group__0_in_ruleEQFilter220);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:145:1: entryRuleProperty : ruleProperty EOF ;
+    public final void entryRuleProperty() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:146:1: ( ruleProperty EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:147:1: ruleProperty EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyRule()); 
+            }
+            pushFollow(FOLLOW_ruleProperty_in_entryRuleProperty247);
+            ruleProperty();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleProperty254); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleProperty"
+
+
+    // $ANTLR start "ruleProperty"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:154:1: ruleProperty : ( ( rule__Property__Group__0 ) ) ;
+    public final void ruleProperty() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:158:2: ( ( ( rule__Property__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:159:1: ( ( rule__Property__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:159:1: ( ( rule__Property__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:160:1: ( rule__Property__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:161:1: ( rule__Property__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:161:2: rule__Property__Group__0
+            {
+            pushFollow(FOLLOW_rule__Property__Group__0_in_ruleProperty280);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:173:1: entryRuleNestedField : ruleNestedField EOF ;
+    public final void entryRuleNestedField() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:174:1: ( ruleNestedField EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:175:1: ruleNestedField EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedFieldRule()); 
+            }
+            pushFollow(FOLLOW_ruleNestedField_in_entryRuleNestedField307);
+            ruleNestedField();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedFieldRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleNestedField314); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleNestedField"
+
+
+    // $ANTLR start "ruleNestedField"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:182:1: ruleNestedField : ( ( rule__NestedField__Group__0 ) ) ;
+    public final void ruleNestedField() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:186:2: ( ( ( rule__NestedField__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:187:1: ( ( rule__NestedField__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:187:1: ( ( rule__NestedField__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:188:1: ( rule__NestedField__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedFieldAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:189:1: ( rule__NestedField__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:189:2: rule__NestedField__Group__0
+            {
+            pushFollow(FOLLOW_rule__NestedField__Group__0_in_ruleNestedField340);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:201:1: entryRuleNestedPath : ruleNestedPath EOF ;
+    public final void entryRuleNestedPath() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:202:1: ( ruleNestedPath EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:203:1: ruleNestedPath EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathRule()); 
+            }
+            pushFollow(FOLLOW_ruleNestedPath_in_entryRuleNestedPath367);
+            ruleNestedPath();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNestedPathRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleNestedPath374); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleNestedPath"
+
+
+    // $ANTLR start "ruleNestedPath"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:210:1: ruleNestedPath : ( ( rule__NestedPath__Group__0 ) ) ;
+    public final void ruleNestedPath() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:214:2: ( ( ( rule__NestedPath__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:215:1: ( ( rule__NestedPath__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:215:1: ( ( rule__NestedPath__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:216:1: ( rule__NestedPath__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:217:1: ( rule__NestedPath__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:217:2: rule__NestedPath__Group__0
+            {
+            pushFollow(FOLLOW_rule__NestedPath__Group__0_in_ruleNestedPath400);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:229:1: entryRulePropertyStyle : rulePropertyStyle EOF ;
+    public final void entryRulePropertyStyle() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:230:1: ( rulePropertyStyle EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:231:1: rulePropertyStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyStyle_in_entryRulePropertyStyle427);
+            rulePropertyStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyStyle434); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyStyle"
+
+
+    // $ANTLR start "rulePropertyStyle"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:238:1: rulePropertyStyle : ( ( rule__PropertyStyle__Alternatives ) ) ;
+    public final void rulePropertyStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:242:2: ( ( ( rule__PropertyStyle__Alternatives ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:243:1: ( ( rule__PropertyStyle__Alternatives ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:243:1: ( ( rule__PropertyStyle__Alternatives ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:244:1: ( rule__PropertyStyle__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyStyleAccess().getAlternatives()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:245:1: ( rule__PropertyStyle__Alternatives )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:245:2: rule__PropertyStyle__Alternatives
+            {
+            pushFollow(FOLLOW_rule__PropertyStyle__Alternatives_in_rulePropertyStyle460);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:257:1: entryRulePropertyButtonStyle : rulePropertyButtonStyle EOF ;
+    public final void entryRulePropertyButtonStyle() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:258:1: ( rulePropertyButtonStyle EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:259:1: rulePropertyButtonStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyButtonStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyButtonStyle_in_entryRulePropertyButtonStyle487);
+            rulePropertyButtonStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyButtonStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyButtonStyle494); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyButtonStyle"
+
+
+    // $ANTLR start "rulePropertyButtonStyle"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:266:1: rulePropertyButtonStyle : ( ( rule__PropertyButtonStyle__Group__0 ) ) ;
+    public final void rulePropertyButtonStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:270:2: ( ( ( rule__PropertyButtonStyle__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:271:1: ( ( rule__PropertyButtonStyle__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:271:1: ( ( rule__PropertyButtonStyle__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:272:1: ( rule__PropertyButtonStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyButtonStyleAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:273:1: ( rule__PropertyButtonStyle__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:273:2: rule__PropertyButtonStyle__Group__0
+            {
+            pushFollow(FOLLOW_rule__PropertyButtonStyle__Group__0_in_rulePropertyButtonStyle520);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:285:1: entryRulePropertyHtmlStyle : rulePropertyHtmlStyle EOF ;
+    public final void entryRulePropertyHtmlStyle() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:286:1: ( rulePropertyHtmlStyle EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:287:1: rulePropertyHtmlStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyHtmlStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyHtmlStyle_in_entryRulePropertyHtmlStyle547);
+            rulePropertyHtmlStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyHtmlStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyHtmlStyle554); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyHtmlStyle"
+
+
+    // $ANTLR start "rulePropertyHtmlStyle"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:294:1: rulePropertyHtmlStyle : ( ( rule__PropertyHtmlStyle__Group__0 ) ) ;
+    public final void rulePropertyHtmlStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:298:2: ( ( ( rule__PropertyHtmlStyle__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:299:1: ( ( rule__PropertyHtmlStyle__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:299:1: ( ( rule__PropertyHtmlStyle__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:300:1: ( rule__PropertyHtmlStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyHtmlStyleAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:301:1: ( rule__PropertyHtmlStyle__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:301:2: rule__PropertyHtmlStyle__Group__0
+            {
+            pushFollow(FOLLOW_rule__PropertyHtmlStyle__Group__0_in_rulePropertyHtmlStyle580);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:313:1: entryRulePropertyBooleanStyle : rulePropertyBooleanStyle EOF ;
+    public final void entryRulePropertyBooleanStyle() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:314:1: ( rulePropertyBooleanStyle EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:315:1: rulePropertyBooleanStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyBooleanStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyBooleanStyle_in_entryRulePropertyBooleanStyle607);
+            rulePropertyBooleanStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyBooleanStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyBooleanStyle614); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyBooleanStyle"
+
+
+    // $ANTLR start "rulePropertyBooleanStyle"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:322:1: rulePropertyBooleanStyle : ( ( rule__PropertyBooleanStyle__Group__0 ) ) ;
+    public final void rulePropertyBooleanStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:326:2: ( ( ( rule__PropertyBooleanStyle__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:327:1: ( ( rule__PropertyBooleanStyle__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:327:1: ( ( rule__PropertyBooleanStyle__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:328:1: ( rule__PropertyBooleanStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyBooleanStyleAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:329:1: ( rule__PropertyBooleanStyle__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:329:2: rule__PropertyBooleanStyle__Group__0
+            {
+            pushFollow(FOLLOW_rule__PropertyBooleanStyle__Group__0_in_rulePropertyBooleanStyle640);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:341:1: entryRulePropertyDateStyle : rulePropertyDateStyle EOF ;
+    public final void entryRulePropertyDateStyle() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:342:1: ( rulePropertyDateStyle EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:343:1: rulePropertyDateStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyDateStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyDateStyle_in_entryRulePropertyDateStyle667);
+            rulePropertyDateStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyDateStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyDateStyle674); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyDateStyle"
+
+
+    // $ANTLR start "rulePropertyDateStyle"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:350:1: rulePropertyDateStyle : ( ( rule__PropertyDateStyle__Group__0 ) ) ;
+    public final void rulePropertyDateStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:354:2: ( ( ( rule__PropertyDateStyle__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:355:1: ( ( rule__PropertyDateStyle__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:355:1: ( ( rule__PropertyDateStyle__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:356:1: ( rule__PropertyDateStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyDateStyleAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:357:1: ( rule__PropertyDateStyle__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:357:2: rule__PropertyDateStyle__Group__0
+            {
+            pushFollow(FOLLOW_rule__PropertyDateStyle__Group__0_in_rulePropertyDateStyle700);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:369:1: entryRulePropertyNumberStyle : rulePropertyNumberStyle EOF ;
+    public final void entryRulePropertyNumberStyle() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:370:1: ( rulePropertyNumberStyle EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:371:1: rulePropertyNumberStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyNumberStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyNumberStyle_in_entryRulePropertyNumberStyle727);
+            rulePropertyNumberStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyNumberStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyNumberStyle734); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyNumberStyle"
+
+
+    // $ANTLR start "rulePropertyNumberStyle"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:378:1: rulePropertyNumberStyle : ( ( rule__PropertyNumberStyle__Group__0 ) ) ;
+    public final void rulePropertyNumberStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:382:2: ( ( ( rule__PropertyNumberStyle__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:383:1: ( ( rule__PropertyNumberStyle__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:383:1: ( ( rule__PropertyNumberStyle__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:384:1: ( rule__PropertyNumberStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyNumberStyleAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:385:1: ( rule__PropertyNumberStyle__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:385:2: rule__PropertyNumberStyle__Group__0
+            {
+            pushFollow(FOLLOW_rule__PropertyNumberStyle__Group__0_in_rulePropertyNumberStyle760);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:397:1: entryRulePropertyProgressbarStyle : rulePropertyProgressbarStyle EOF ;
+    public final void entryRulePropertyProgressbarStyle() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:398:1: ( rulePropertyProgressbarStyle EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:399:1: rulePropertyProgressbarStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyProgressbarStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyProgressbarStyle_in_entryRulePropertyProgressbarStyle787);
+            rulePropertyProgressbarStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyProgressbarStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyProgressbarStyle794); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyProgressbarStyle"
+
+
+    // $ANTLR start "rulePropertyProgressbarStyle"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:406:1: rulePropertyProgressbarStyle : ( ( rule__PropertyProgressbarStyle__Group__0 ) ) ;
+    public final void rulePropertyProgressbarStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:410:2: ( ( ( rule__PropertyProgressbarStyle__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:411:1: ( ( rule__PropertyProgressbarStyle__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:411:1: ( ( rule__PropertyProgressbarStyle__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:412:1: ( rule__PropertyProgressbarStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyProgressbarStyleAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:413:1: ( rule__PropertyProgressbarStyle__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:413:2: rule__PropertyProgressbarStyle__Group__0
+            {
+            pushFollow(FOLLOW_rule__PropertyProgressbarStyle__Group__0_in_rulePropertyProgressbarStyle820);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:425:1: entryRuleGridPropIndicatorStyle : ruleGridPropIndicatorStyle EOF ;
+    public final void entryRuleGridPropIndicatorStyle() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:426:1: ( ruleGridPropIndicatorStyle EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:427:1: ruleGridPropIndicatorStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleRule()); 
+            }
+            pushFollow(FOLLOW_ruleGridPropIndicatorStyle_in_entryRuleGridPropIndicatorStyle847);
+            ruleGridPropIndicatorStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getGridPropIndicatorStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleGridPropIndicatorStyle854); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleGridPropIndicatorStyle"
+
+
+    // $ANTLR start "ruleGridPropIndicatorStyle"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:434:1: ruleGridPropIndicatorStyle : ( ( rule__GridPropIndicatorStyle__Group__0 ) ) ;
+    public final void ruleGridPropIndicatorStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:438:2: ( ( ( rule__GridPropIndicatorStyle__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:439:1: ( ( rule__GridPropIndicatorStyle__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:439:1: ( ( rule__GridPropIndicatorStyle__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:440:1: ( rule__GridPropIndicatorStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:441:1: ( rule__GridPropIndicatorStyle__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:441:2: rule__GridPropIndicatorStyle__Group__0
+            {
+            pushFollow(FOLLOW_rule__GridPropIndicatorStyle__Group__0_in_ruleGridPropIndicatorStyle880);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:453:1: entryRulePropertyQuantityStyle : rulePropertyQuantityStyle EOF ;
+    public final void entryRulePropertyQuantityStyle() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:454:1: ( rulePropertyQuantityStyle EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:455:1: rulePropertyQuantityStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyQuantityStyle_in_entryRulePropertyQuantityStyle907);
+            rulePropertyQuantityStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyQuantityStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyQuantityStyle914); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyQuantityStyle"
+
+
+    // $ANTLR start "rulePropertyQuantityStyle"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:462:1: rulePropertyQuantityStyle : ( ( rule__PropertyQuantityStyle__Group__0 ) ) ;
+    public final void rulePropertyQuantityStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:466:2: ( ( ( rule__PropertyQuantityStyle__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:467:1: ( ( rule__PropertyQuantityStyle__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:467:1: ( ( rule__PropertyQuantityStyle__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:468:1: ( rule__PropertyQuantityStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:469:1: ( rule__PropertyQuantityStyle__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:469:2: rule__PropertyQuantityStyle__Group__0
+            {
+            pushFollow(FOLLOW_rule__PropertyQuantityStyle__Group__0_in_rulePropertyQuantityStyle940);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:481:1: entryRulePropertyPriceStyle : rulePropertyPriceStyle EOF ;
+    public final void entryRulePropertyPriceStyle() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:482:1: ( rulePropertyPriceStyle EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:483:1: rulePropertyPriceStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyPriceStyle_in_entryRulePropertyPriceStyle967);
+            rulePropertyPriceStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyPriceStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyPriceStyle974); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyPriceStyle"
+
+
+    // $ANTLR start "rulePropertyPriceStyle"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:490:1: rulePropertyPriceStyle : ( ( rule__PropertyPriceStyle__Group__0 ) ) ;
+    public final void rulePropertyPriceStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:494:2: ( ( ( rule__PropertyPriceStyle__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:495:1: ( ( rule__PropertyPriceStyle__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:495:1: ( ( rule__PropertyPriceStyle__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:496:1: ( rule__PropertyPriceStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyPriceStyleAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:497:1: ( rule__PropertyPriceStyle__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:497:2: rule__PropertyPriceStyle__Group__0
+            {
+            pushFollow(FOLLOW_rule__PropertyPriceStyle__Group__0_in_rulePropertyPriceStyle1000);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:509:1: entryRulePropertyTextStyle : rulePropertyTextStyle EOF ;
+    public final void entryRulePropertyTextStyle() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:510:1: ( rulePropertyTextStyle EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:511:1: rulePropertyTextStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyTextStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyTextStyle_in_entryRulePropertyTextStyle1027);
+            rulePropertyTextStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyTextStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyTextStyle1034); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyTextStyle"
+
+
+    // $ANTLR start "rulePropertyTextStyle"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:518:1: rulePropertyTextStyle : ( ( rule__PropertyTextStyle__Group__0 ) ) ;
+    public final void rulePropertyTextStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:522:2: ( ( ( rule__PropertyTextStyle__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:523:1: ( ( rule__PropertyTextStyle__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:523:1: ( ( rule__PropertyTextStyle__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:524:1: ( rule__PropertyTextStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyTextStyleAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:525:1: ( rule__PropertyTextStyle__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:525:2: rule__PropertyTextStyle__Group__0
+            {
+            pushFollow(FOLLOW_rule__PropertyTextStyle__Group__0_in_rulePropertyTextStyle1060);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:537:1: entryRulePropertyImageStyle : rulePropertyImageStyle EOF ;
+    public final void entryRulePropertyImageStyle() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:538:1: ( rulePropertyImageStyle EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:539:1: rulePropertyImageStyle EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyImageStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyImageStyle_in_entryRulePropertyImageStyle1087);
+            rulePropertyImageStyle();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getPropertyImageStyleRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyImageStyle1094); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRulePropertyImageStyle"
+
+
+    // $ANTLR start "rulePropertyImageStyle"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:546:1: rulePropertyImageStyle : ( ( rule__PropertyImageStyle__Group__0 ) ) ;
+    public final void rulePropertyImageStyle() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:550:2: ( ( ( rule__PropertyImageStyle__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:551:1: ( ( rule__PropertyImageStyle__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:551:1: ( ( rule__PropertyImageStyle__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:552:1: ( rule__PropertyImageStyle__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyImageStyleAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:553:1: ( rule__PropertyImageStyle__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:553:2: rule__PropertyImageStyle__Group__0
+            {
+            pushFollow(FOLLOW_rule__PropertyImageStyle__Group__0_in_rulePropertyImageStyle1120);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:565:1: entryRuleQualifiedName : ruleQualifiedName EOF ;
+    public final void entryRuleQualifiedName() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:566:1: ( ruleQualifiedName EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:567:1: ruleQualifiedName EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameRule()); 
+            }
+            pushFollow(FOLLOW_ruleQualifiedName_in_entryRuleQualifiedName1147);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedName1154); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleQualifiedName"
+
+
+    // $ANTLR start "ruleQualifiedName"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:574:1: ruleQualifiedName : ( ( rule__QualifiedName__Group__0 ) ) ;
+    public final void ruleQualifiedName() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:578:2: ( ( ( rule__QualifiedName__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:579:1: ( ( rule__QualifiedName__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:579:1: ( ( rule__QualifiedName__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:580:1: ( rule__QualifiedName__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:581:1: ( rule__QualifiedName__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:581:2: rule__QualifiedName__Group__0
+            {
+            pushFollow(FOLLOW_rule__QualifiedName__Group__0_in_ruleQualifiedName1180);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:593:1: entryRuleValidID : ruleValidID EOF ;
+    public final void entryRuleValidID() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:594:1: ( ruleValidID EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:595:1: ruleValidID EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValidIDRule()); 
+            }
+            pushFollow(FOLLOW_ruleValidID_in_entryRuleValidID1207);
+            ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getValidIDRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleValidID1214); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleValidID"
+
+
+    // $ANTLR start "ruleValidID"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:602:1: ruleValidID : ( RULE_ID ) ;
+    public final void ruleValidID() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:606:2: ( ( RULE_ID ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:607:1: ( RULE_ID )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:607:1: ( RULE_ID )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:608:1: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
+            }
+            match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleValidID1240); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:621:1: entryRuleStyleConfig : ruleStyleConfig EOF ;
+    public final void entryRuleStyleConfig() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:622:1: ( ruleStyleConfig EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:623:1: ruleStyleConfig EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStyleConfigRule()); 
+            }
+            pushFollow(FOLLOW_ruleStyleConfig_in_entryRuleStyleConfig1266);
+            ruleStyleConfig();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStyleConfigRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStyleConfig1273); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleStyleConfig"
+
+
+    // $ANTLR start "ruleStyleConfig"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:630:1: ruleStyleConfig : ( ( rule__StyleConfig__Alternatives ) ) ;
+    public final void ruleStyleConfig() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:634:2: ( ( ( rule__StyleConfig__Alternatives ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:635:1: ( ( rule__StyleConfig__Alternatives ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:635:1: ( ( rule__StyleConfig__Alternatives ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:636:1: ( rule__StyleConfig__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStyleConfigAccess().getAlternatives()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:637:1: ( rule__StyleConfig__Alternatives )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:637:2: rule__StyleConfig__Alternatives
+            {
+            pushFollow(FOLLOW_rule__StyleConfig__Alternatives_in_ruleStyleConfig1299);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:649:1: entryRuleNumericToResourceStyleConfig : ruleNumericToResourceStyleConfig EOF ;
+    public final void entryRuleNumericToResourceStyleConfig() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:650:1: ( ruleNumericToResourceStyleConfig EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:651:1: ruleNumericToResourceStyleConfig EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumericToResourceStyleConfigRule()); 
+            }
+            pushFollow(FOLLOW_ruleNumericToResourceStyleConfig_in_entryRuleNumericToResourceStyleConfig1326);
+            ruleNumericToResourceStyleConfig();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getNumericToResourceStyleConfigRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleNumericToResourceStyleConfig1333); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleNumericToResourceStyleConfig"
+
+
+    // $ANTLR start "ruleNumericToResourceStyleConfig"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:658:1: ruleNumericToResourceStyleConfig : ( ( rule__NumericToResourceStyleConfig__Group__0 ) ) ;
+    public final void ruleNumericToResourceStyleConfig() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:662:2: ( ( ( rule__NumericToResourceStyleConfig__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:663:1: ( ( rule__NumericToResourceStyleConfig__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:663:1: ( ( rule__NumericToResourceStyleConfig__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:664:1: ( rule__NumericToResourceStyleConfig__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNumericToResourceStyleConfigAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:665:1: ( rule__NumericToResourceStyleConfig__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:665:2: rule__NumericToResourceStyleConfig__Group__0
+            {
+            pushFollow(FOLLOW_rule__NumericToResourceStyleConfig__Group__0_in_ruleNumericToResourceStyleConfig1359);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:677:1: entryRuleStringToResourceStyleConfig : ruleStringToResourceStyleConfig EOF ;
+    public final void entryRuleStringToResourceStyleConfig() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:678:1: ( ruleStringToResourceStyleConfig EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:679:1: ruleStringToResourceStyleConfig EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStringToResourceStyleConfigRule()); 
+            }
+            pushFollow(FOLLOW_ruleStringToResourceStyleConfig_in_entryRuleStringToResourceStyleConfig1386);
+            ruleStringToResourceStyleConfig();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getStringToResourceStyleConfigRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStringToResourceStyleConfig1393); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleStringToResourceStyleConfig"
+
+
+    // $ANTLR start "ruleStringToResourceStyleConfig"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:686:1: ruleStringToResourceStyleConfig : ( ( rule__StringToResourceStyleConfig__Group__0 ) ) ;
+    public final void ruleStringToResourceStyleConfig() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:690:2: ( ( ( rule__StringToResourceStyleConfig__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:691:1: ( ( rule__StringToResourceStyleConfig__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:691:1: ( ( rule__StringToResourceStyleConfig__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:692:1: ( rule__StringToResourceStyleConfig__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStringToResourceStyleConfigAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:693:1: ( rule__StringToResourceStyleConfig__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:693:2: rule__StringToResourceStyleConfig__Group__0
+            {
+            pushFollow(FOLLOW_rule__StringToResourceStyleConfig__Group__0_in_ruleStringToResourceStyleConfig1419);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:705:1: entryRuleLInt : ruleLInt EOF ;
+    public final void entryRuleLInt() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:706:1: ( ruleLInt EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:707:1: ruleLInt EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLIntRule()); 
+            }
+            pushFollow(FOLLOW_ruleLInt_in_entryRuleLInt1446);
+            ruleLInt();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLIntRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleLInt1453); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLInt"
+
+
+    // $ANTLR start "ruleLInt"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:714:1: ruleLInt : ( ( rule__LInt__Group__0 ) ) ;
+    public final void ruleLInt() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:718:2: ( ( ( rule__LInt__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:719:1: ( ( rule__LInt__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:719:1: ( ( rule__LInt__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:720:1: ( rule__LInt__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLIntAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:721:1: ( rule__LInt__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:721:2: rule__LInt__Group__0
+            {
+            pushFollow(FOLLOW_rule__LInt__Group__0_in_ruleLInt1479);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:733:1: entryRuleLDouble : ruleLDouble EOF ;
+    public final void entryRuleLDouble() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:734:1: ( ruleLDouble EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:735:1: ruleLDouble EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLDoubleRule()); 
+            }
+            pushFollow(FOLLOW_ruleLDouble_in_entryRuleLDouble1506);
+            ruleLDouble();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getLDoubleRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleLDouble1513); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleLDouble"
+
+
+    // $ANTLR start "ruleLDouble"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:742:1: ruleLDouble : ( ( rule__LDouble__Group__0 ) ) ;
+    public final void ruleLDouble() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:746:2: ( ( ( rule__LDouble__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:747:1: ( ( rule__LDouble__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:747:1: ( ( rule__LDouble__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:748:1: ( rule__LDouble__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getLDoubleAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:749:1: ( rule__LDouble__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:749:2: rule__LDouble__Group__0
+            {
+            pushFollow(FOLLOW_rule__LDouble__Group__0_in_ruleLDouble1539);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:761:1: entryRuleJvmTypeReference : ruleJvmTypeReference EOF ;
+    public final void entryRuleJvmTypeReference() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:762:1: ( ruleJvmTypeReference EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:763:1: ruleJvmTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmTypeReference_in_entryRuleJvmTypeReference1566);
+            ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmTypeReference1573); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmTypeReference"
+
+
+    // $ANTLR start "ruleJvmTypeReference"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:770:1: ruleJvmTypeReference : ( ( rule__JvmTypeReference__Alternatives ) ) ;
+    public final void ruleJvmTypeReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:774:2: ( ( ( rule__JvmTypeReference__Alternatives ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:775:1: ( ( rule__JvmTypeReference__Alternatives ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:775:1: ( ( rule__JvmTypeReference__Alternatives ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:776:1: ( rule__JvmTypeReference__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:777:1: ( rule__JvmTypeReference__Alternatives )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:777:2: rule__JvmTypeReference__Alternatives
+            {
+            pushFollow(FOLLOW_rule__JvmTypeReference__Alternatives_in_ruleJvmTypeReference1599);
+            rule__JvmTypeReference__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmTypeReference"
+
+
+    // $ANTLR start "entryRuleArrayBrackets"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:789:1: entryRuleArrayBrackets : ruleArrayBrackets EOF ;
+    public final void entryRuleArrayBrackets() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:790:1: ( ruleArrayBrackets EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:791:1: ruleArrayBrackets EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArrayBracketsRule()); 
+            }
+            pushFollow(FOLLOW_ruleArrayBrackets_in_entryRuleArrayBrackets1626);
+            ruleArrayBrackets();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArrayBracketsRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleArrayBrackets1633); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleArrayBrackets"
+
+
+    // $ANTLR start "ruleArrayBrackets"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:798:1: ruleArrayBrackets : ( ( rule__ArrayBrackets__Group__0 ) ) ;
+    public final void ruleArrayBrackets() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:802:2: ( ( ( rule__ArrayBrackets__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:803:1: ( ( rule__ArrayBrackets__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:803:1: ( ( rule__ArrayBrackets__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:804:1: ( rule__ArrayBrackets__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getArrayBracketsAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:805:1: ( rule__ArrayBrackets__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:805:2: rule__ArrayBrackets__Group__0
+            {
+            pushFollow(FOLLOW_rule__ArrayBrackets__Group__0_in_ruleArrayBrackets1659);
+            rule__ArrayBrackets__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getArrayBracketsAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleArrayBrackets"
+
+
+    // $ANTLR start "entryRuleXFunctionTypeRef"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:817:1: entryRuleXFunctionTypeRef : ruleXFunctionTypeRef EOF ;
+    public final void entryRuleXFunctionTypeRef() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:818:1: ( ruleXFunctionTypeRef EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:819:1: ruleXFunctionTypeRef EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefRule()); 
+            }
+            pushFollow(FOLLOW_ruleXFunctionTypeRef_in_entryRuleXFunctionTypeRef1686);
+            ruleXFunctionTypeRef();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleXFunctionTypeRef1693); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXFunctionTypeRef"
+
+
+    // $ANTLR start "ruleXFunctionTypeRef"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:826:1: ruleXFunctionTypeRef : ( ( rule__XFunctionTypeRef__Group__0 ) ) ;
+    public final void ruleXFunctionTypeRef() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:830:2: ( ( ( rule__XFunctionTypeRef__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:831:1: ( ( rule__XFunctionTypeRef__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:831:1: ( ( rule__XFunctionTypeRef__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:832:1: ( rule__XFunctionTypeRef__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:833:1: ( rule__XFunctionTypeRef__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:833:2: rule__XFunctionTypeRef__Group__0
+            {
+            pushFollow(FOLLOW_rule__XFunctionTypeRef__Group__0_in_ruleXFunctionTypeRef1719);
+            rule__XFunctionTypeRef__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleXFunctionTypeRef"
+
+
+    // $ANTLR start "entryRuleJvmParameterizedTypeReference"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:845:1: entryRuleJvmParameterizedTypeReference : ruleJvmParameterizedTypeReference EOF ;
+    public final void entryRuleJvmParameterizedTypeReference() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:846:1: ( ruleJvmParameterizedTypeReference EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:847:1: ruleJvmParameterizedTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmParameterizedTypeReference_in_entryRuleJvmParameterizedTypeReference1746);
+            ruleJvmParameterizedTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmParameterizedTypeReference1753); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmParameterizedTypeReference"
+
+
+    // $ANTLR start "ruleJvmParameterizedTypeReference"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:854:1: ruleJvmParameterizedTypeReference : ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) ;
+    public final void ruleJvmParameterizedTypeReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:858:2: ( ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:859:1: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:859:1: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:860:1: ( rule__JvmParameterizedTypeReference__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:861:1: ( rule__JvmParameterizedTypeReference__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:861:2: rule__JvmParameterizedTypeReference__Group__0
+            {
+            pushFollow(FOLLOW_rule__JvmParameterizedTypeReference__Group__0_in_ruleJvmParameterizedTypeReference1779);
+            rule__JvmParameterizedTypeReference__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmParameterizedTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmArgumentTypeReference"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:873:1: entryRuleJvmArgumentTypeReference : ruleJvmArgumentTypeReference EOF ;
+    public final void entryRuleJvmArgumentTypeReference() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:874:1: ( ruleJvmArgumentTypeReference EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:875:1: ruleJvmArgumentTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmArgumentTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_entryRuleJvmArgumentTypeReference1806);
+            ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmArgumentTypeReferenceRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmArgumentTypeReference1813); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmArgumentTypeReference"
+
+
+    // $ANTLR start "ruleJvmArgumentTypeReference"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:882:1: ruleJvmArgumentTypeReference : ( ( rule__JvmArgumentTypeReference__Alternatives ) ) ;
+    public final void ruleJvmArgumentTypeReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:886:2: ( ( ( rule__JvmArgumentTypeReference__Alternatives ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:887:1: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:887:1: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:888:1: ( rule__JvmArgumentTypeReference__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:889:1: ( rule__JvmArgumentTypeReference__Alternatives )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:889:2: rule__JvmArgumentTypeReference__Alternatives
+            {
+            pushFollow(FOLLOW_rule__JvmArgumentTypeReference__Alternatives_in_ruleJvmArgumentTypeReference1839);
+            rule__JvmArgumentTypeReference__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmArgumentTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmWildcardTypeReference"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:901:1: entryRuleJvmWildcardTypeReference : ruleJvmWildcardTypeReference EOF ;
+    public final void entryRuleJvmWildcardTypeReference() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:902:1: ( ruleJvmWildcardTypeReference EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:903:1: ruleJvmWildcardTypeReference EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmWildcardTypeReference_in_entryRuleJvmWildcardTypeReference1866);
+            ruleJvmWildcardTypeReference();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmWildcardTypeReference1873); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmWildcardTypeReference"
+
+
+    // $ANTLR start "ruleJvmWildcardTypeReference"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:910:1: ruleJvmWildcardTypeReference : ( ( rule__JvmWildcardTypeReference__Group__0 ) ) ;
+    public final void ruleJvmWildcardTypeReference() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:914:2: ( ( ( rule__JvmWildcardTypeReference__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:915:1: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:915:1: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:916:1: ( rule__JvmWildcardTypeReference__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:917:1: ( rule__JvmWildcardTypeReference__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:917:2: rule__JvmWildcardTypeReference__Group__0
+            {
+            pushFollow(FOLLOW_rule__JvmWildcardTypeReference__Group__0_in_ruleJvmWildcardTypeReference1899);
+            rule__JvmWildcardTypeReference__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmWildcardTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmUpperBound"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:929:1: entryRuleJvmUpperBound : ruleJvmUpperBound EOF ;
+    public final void entryRuleJvmUpperBound() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:930:1: ( ruleJvmUpperBound EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:931:1: ruleJvmUpperBound EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmUpperBound_in_entryRuleJvmUpperBound1926);
+            ruleJvmUpperBound();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmUpperBound1933); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmUpperBound"
+
+
+    // $ANTLR start "ruleJvmUpperBound"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:938:1: ruleJvmUpperBound : ( ( rule__JvmUpperBound__Group__0 ) ) ;
+    public final void ruleJvmUpperBound() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:942:2: ( ( ( rule__JvmUpperBound__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:943:1: ( ( rule__JvmUpperBound__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:943:1: ( ( rule__JvmUpperBound__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:944:1: ( rule__JvmUpperBound__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:945:1: ( rule__JvmUpperBound__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:945:2: rule__JvmUpperBound__Group__0
+            {
+            pushFollow(FOLLOW_rule__JvmUpperBound__Group__0_in_ruleJvmUpperBound1959);
+            rule__JvmUpperBound__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmUpperBound"
+
+
+    // $ANTLR start "entryRuleJvmUpperBoundAnded"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:957:1: entryRuleJvmUpperBoundAnded : ruleJvmUpperBoundAnded EOF ;
+    public final void entryRuleJvmUpperBoundAnded() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:958:1: ( ruleJvmUpperBoundAnded EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:959:1: ruleJvmUpperBoundAnded EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAndedRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmUpperBoundAnded_in_entryRuleJvmUpperBoundAnded1986);
+            ruleJvmUpperBoundAnded();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAndedRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmUpperBoundAnded1993); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmUpperBoundAnded"
+
+
+    // $ANTLR start "ruleJvmUpperBoundAnded"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:966:1: ruleJvmUpperBoundAnded : ( ( rule__JvmUpperBoundAnded__Group__0 ) ) ;
+    public final void ruleJvmUpperBoundAnded() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:970:2: ( ( ( rule__JvmUpperBoundAnded__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:971:1: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:971:1: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:972:1: ( rule__JvmUpperBoundAnded__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:973:1: ( rule__JvmUpperBoundAnded__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:973:2: rule__JvmUpperBoundAnded__Group__0
+            {
+            pushFollow(FOLLOW_rule__JvmUpperBoundAnded__Group__0_in_ruleJvmUpperBoundAnded2019);
+            rule__JvmUpperBoundAnded__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmUpperBoundAnded"
+
+
+    // $ANTLR start "entryRuleJvmLowerBound"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:985:1: entryRuleJvmLowerBound : ruleJvmLowerBound EOF ;
+    public final void entryRuleJvmLowerBound() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:986:1: ( ruleJvmLowerBound EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:987:1: ruleJvmLowerBound EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmLowerBound_in_entryRuleJvmLowerBound2046);
+            ruleJvmLowerBound();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmLowerBound2053); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmLowerBound"
+
+
+    // $ANTLR start "ruleJvmLowerBound"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:994:1: ruleJvmLowerBound : ( ( rule__JvmLowerBound__Group__0 ) ) ;
+    public final void ruleJvmLowerBound() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:998:2: ( ( ( rule__JvmLowerBound__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:999:1: ( ( rule__JvmLowerBound__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:999:1: ( ( rule__JvmLowerBound__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1000:1: ( rule__JvmLowerBound__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1001:1: ( rule__JvmLowerBound__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1001:2: rule__JvmLowerBound__Group__0
+            {
+            pushFollow(FOLLOW_rule__JvmLowerBound__Group__0_in_ruleJvmLowerBound2079);
+            rule__JvmLowerBound__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmLowerBound"
+
+
+    // $ANTLR start "entryRuleJvmLowerBoundAnded"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1013:1: entryRuleJvmLowerBoundAnded : ruleJvmLowerBoundAnded EOF ;
+    public final void entryRuleJvmLowerBoundAnded() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1014:1: ( ruleJvmLowerBoundAnded EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1015:1: ruleJvmLowerBoundAnded EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAndedRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmLowerBoundAnded_in_entryRuleJvmLowerBoundAnded2106);
+            ruleJvmLowerBoundAnded();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAndedRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmLowerBoundAnded2113); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleJvmLowerBoundAnded"
+
+
+    // $ANTLR start "ruleJvmLowerBoundAnded"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1022:1: ruleJvmLowerBoundAnded : ( ( rule__JvmLowerBoundAnded__Group__0 ) ) ;
+    public final void ruleJvmLowerBoundAnded() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1026:2: ( ( ( rule__JvmLowerBoundAnded__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1027:1: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1027:1: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1028:1: ( rule__JvmLowerBoundAnded__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1029:1: ( rule__JvmLowerBoundAnded__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1029:2: rule__JvmLowerBoundAnded__Group__0
+            {
+            pushFollow(FOLLOW_rule__JvmLowerBoundAnded__Group__0_in_ruleJvmLowerBoundAnded2139);
+            rule__JvmLowerBoundAnded__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleJvmLowerBoundAnded"
+
+
+    // $ANTLR start "entryRuleQualifiedNameWithWildcard"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1043:1: entryRuleQualifiedNameWithWildcard : ruleQualifiedNameWithWildcard EOF ;
+    public final void entryRuleQualifiedNameWithWildcard() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1044:1: ( ruleQualifiedNameWithWildcard EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1045:1: ruleQualifiedNameWithWildcard EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameWithWildcardRule()); 
+            }
+            pushFollow(FOLLOW_ruleQualifiedNameWithWildcard_in_entryRuleQualifiedNameWithWildcard2168);
+            ruleQualifiedNameWithWildcard();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameWithWildcardRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedNameWithWildcard2175); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleQualifiedNameWithWildcard"
+
+
+    // $ANTLR start "ruleQualifiedNameWithWildcard"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1052:1: ruleQualifiedNameWithWildcard : ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) ;
+    public final void ruleQualifiedNameWithWildcard() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1056:2: ( ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1057:1: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1057:1: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1058:1: ( rule__QualifiedNameWithWildcard__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1059:1: ( rule__QualifiedNameWithWildcard__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1059:2: rule__QualifiedNameWithWildcard__Group__0
+            {
+            pushFollow(FOLLOW_rule__QualifiedNameWithWildcard__Group__0_in_ruleQualifiedNameWithWildcard2201);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1073:1: entryRuleXImportDeclaration : ruleXImportDeclaration EOF ;
+    public final void entryRuleXImportDeclaration() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1074:1: ( ruleXImportDeclaration EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1075:1: ruleXImportDeclaration EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationRule()); 
+            }
+            pushFollow(FOLLOW_ruleXImportDeclaration_in_entryRuleXImportDeclaration2230);
+            ruleXImportDeclaration();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getXImportDeclarationRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleXImportDeclaration2237); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleXImportDeclaration"
+
+
+    // $ANTLR start "ruleXImportDeclaration"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1082:1: ruleXImportDeclaration : ( ( rule__XImportDeclaration__Group__0 ) ) ;
+    public final void ruleXImportDeclaration() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1086:2: ( ( ( rule__XImportDeclaration__Group__0 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1087:1: ( ( rule__XImportDeclaration__Group__0 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1087:1: ( ( rule__XImportDeclaration__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1088:1: ( rule__XImportDeclaration__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getXImportDeclarationAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1089:1: ( rule__XImportDeclaration__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1089:2: rule__XImportDeclaration__Group__0
+            {
+            pushFollow(FOLLOW_rule__XImportDeclaration__Group__0_in_ruleXImportDeclaration2263);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1101:1: entryRuleQualifiedNameInStaticImport : ruleQualifiedNameInStaticImport EOF ;
+    public final void entryRuleQualifiedNameInStaticImport() throws RecognitionException {
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1102:1: ( ruleQualifiedNameInStaticImport EOF )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1103:1: ruleQualifiedNameInStaticImport EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameInStaticImportRule()); 
+            }
+            pushFollow(FOLLOW_ruleQualifiedNameInStaticImport_in_entryRuleQualifiedNameInStaticImport2290);
+            ruleQualifiedNameInStaticImport();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameInStaticImportRule()); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedNameInStaticImport2297); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleQualifiedNameInStaticImport"
+
+
+    // $ANTLR start "ruleQualifiedNameInStaticImport"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1110:1: ruleQualifiedNameInStaticImport : ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) ;
+    public final void ruleQualifiedNameInStaticImport() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1114:2: ( ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1115:1: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1115:1: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1116:1: ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1116:1: ( ( rule__QualifiedNameInStaticImport__Group__0 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1117:1: ( rule__QualifiedNameInStaticImport__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1118:1: ( rule__QualifiedNameInStaticImport__Group__0 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1118:2: rule__QualifiedNameInStaticImport__Group__0
+            {
+            pushFollow(FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport2325);
+            rule__QualifiedNameInStaticImport__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
+            }
+
+            }
+
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1121:1: ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1122:1: ( rule__QualifiedNameInStaticImport__Group__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1123:1: ( 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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1123:2: rule__QualifiedNameInStaticImport__Group__0
+            	    {
+            	    pushFollow(FOLLOW_rule__QualifiedNameInStaticImport__Group__0_in_ruleQualifiedNameInStaticImport2337);
+            	    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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1137:1: ruleStyleCompare : ( ( rule__StyleCompare__Alternatives ) ) ;
+    public final void ruleStyleCompare() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1141:1: ( ( ( rule__StyleCompare__Alternatives ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1142:1: ( ( rule__StyleCompare__Alternatives ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1142:1: ( ( rule__StyleCompare__Alternatives ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1143:1: ( rule__StyleCompare__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getStyleCompareAccess().getAlternatives()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1144:1: ( rule__StyleCompare__Alternatives )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1144:2: rule__StyleCompare__Alternatives
+            {
+            pushFollow(FOLLOW_rule__StyleCompare__Alternatives_in_ruleStyleCompare2377);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1155: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1159: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 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1160:1: ( rulePropertyButtonStyle )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1160:1: ( rulePropertyButtonStyle )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1161:1: rulePropertyButtonStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyButtonStyleParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_rulePropertyButtonStyle_in_rule__PropertyStyle__Alternatives2412);
+                    rulePropertyButtonStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyButtonStyleParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1166:6: ( rulePropertyHtmlStyle )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1166:6: ( rulePropertyHtmlStyle )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1167:1: rulePropertyHtmlStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyHtmlStyleParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_rulePropertyHtmlStyle_in_rule__PropertyStyle__Alternatives2429);
+                    rulePropertyHtmlStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyHtmlStyleParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1172:6: ( rulePropertyProgressbarStyle )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1172:6: ( rulePropertyProgressbarStyle )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1173:1: rulePropertyProgressbarStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyProgressbarStyleParserRuleCall_2()); 
+                    }
+                    pushFollow(FOLLOW_rulePropertyProgressbarStyle_in_rule__PropertyStyle__Alternatives2446);
+                    rulePropertyProgressbarStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyProgressbarStyleParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1178:6: ( rulePropertyTextStyle )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1178:6: ( rulePropertyTextStyle )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1179:1: rulePropertyTextStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyTextStyleParserRuleCall_3()); 
+                    }
+                    pushFollow(FOLLOW_rulePropertyTextStyle_in_rule__PropertyStyle__Alternatives2463);
+                    rulePropertyTextStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyTextStyleParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1184:6: ( rulePropertyBooleanStyle )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1184:6: ( rulePropertyBooleanStyle )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1185:1: rulePropertyBooleanStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyBooleanStyleParserRuleCall_4()); 
+                    }
+                    pushFollow(FOLLOW_rulePropertyBooleanStyle_in_rule__PropertyStyle__Alternatives2480);
+                    rulePropertyBooleanStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyBooleanStyleParserRuleCall_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1190:6: ( rulePropertyDateStyle )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1190:6: ( rulePropertyDateStyle )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1191:1: rulePropertyDateStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyDateStyleParserRuleCall_5()); 
+                    }
+                    pushFollow(FOLLOW_rulePropertyDateStyle_in_rule__PropertyStyle__Alternatives2497);
+                    rulePropertyDateStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyDateStyleParserRuleCall_5()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 7 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1196:6: ( rulePropertyNumberStyle )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1196:6: ( rulePropertyNumberStyle )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1197:1: rulePropertyNumberStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyNumberStyleParserRuleCall_6()); 
+                    }
+                    pushFollow(FOLLOW_rulePropertyNumberStyle_in_rule__PropertyStyle__Alternatives2514);
+                    rulePropertyNumberStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyNumberStyleParserRuleCall_6()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 8 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1202:6: ( rulePropertyImageStyle )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1202:6: ( rulePropertyImageStyle )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1203:1: rulePropertyImageStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyImageStyleParserRuleCall_7()); 
+                    }
+                    pushFollow(FOLLOW_rulePropertyImageStyle_in_rule__PropertyStyle__Alternatives2531);
+                    rulePropertyImageStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyImageStyleParserRuleCall_7()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 9 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1208:6: ( rulePropertyQuantityStyle )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1208:6: ( rulePropertyQuantityStyle )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1209:1: rulePropertyQuantityStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyQuantityStyleParserRuleCall_8()); 
+                    }
+                    pushFollow(FOLLOW_rulePropertyQuantityStyle_in_rule__PropertyStyle__Alternatives2548);
+                    rulePropertyQuantityStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyQuantityStyleParserRuleCall_8()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 10 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1214:6: ( rulePropertyPriceStyle )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1214:6: ( rulePropertyPriceStyle )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1215:1: rulePropertyPriceStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getPropertyPriceStyleParserRuleCall_9()); 
+                    }
+                    pushFollow(FOLLOW_rulePropertyPriceStyle_in_rule__PropertyStyle__Alternatives2565);
+                    rulePropertyPriceStyle();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getPropertyStyleAccess().getPropertyPriceStyleParserRuleCall_9()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 11 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1220:6: ( ruleGridPropIndicatorStyle )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1220:6: ( ruleGridPropIndicatorStyle )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1221:1: ruleGridPropIndicatorStyle
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getPropertyStyleAccess().getGridPropIndicatorStyleParserRuleCall_10()); 
+                    }
+                    pushFollow(FOLLOW_ruleGridPropIndicatorStyle_in_rule__PropertyStyle__Alternatives2582);
+                    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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1231:1: rule__StyleConfig__Alternatives : ( ( ruleNumericToResourceStyleConfig ) | ( ruleStringToResourceStyleConfig ) );
+    public final void rule__StyleConfig__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1235: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 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1236:1: ( ruleNumericToResourceStyleConfig )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1236:1: ( ruleNumericToResourceStyleConfig )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1237:1: ruleNumericToResourceStyleConfig
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleConfigAccess().getNumericToResourceStyleConfigParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_ruleNumericToResourceStyleConfig_in_rule__StyleConfig__Alternatives2614);
+                    ruleNumericToResourceStyleConfig();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStyleConfigAccess().getNumericToResourceStyleConfigParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1242:6: ( ruleStringToResourceStyleConfig )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1242:6: ( ruleStringToResourceStyleConfig )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1243:1: ruleStringToResourceStyleConfig
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleConfigAccess().getStringToResourceStyleConfigParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_ruleStringToResourceStyleConfig_in_rule__StyleConfig__Alternatives2631);
+                    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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1253:1: rule__LInt__Alternatives_0 : ( ( '+' ) | ( '-' ) );
+    public final void rule__LInt__Alternatives_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1257: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 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1258:1: ( '+' )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1258:1: ( '+' )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1259:1: '+'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLIntAccess().getPlusSignKeyword_0_0()); 
+                    }
+                    match(input,13,FOLLOW_13_in_rule__LInt__Alternatives_02664); if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getLIntAccess().getPlusSignKeyword_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1266:6: ( '-' )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1266:6: ( '-' )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1267:1: '-'
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getLIntAccess().getHyphenMinusKeyword_0_1()); 
+                    }
+                    match(input,14,FOLLOW_14_in_rule__LInt__Alternatives_02684); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1279:1: rule__JvmTypeReference__Alternatives : ( ( ( rule__JvmTypeReference__Group_0__0 ) ) | ( ruleXFunctionTypeRef ) );
+    public final void rule__JvmTypeReference__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1283: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 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1284:1: ( ( rule__JvmTypeReference__Group_0__0 ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1284:1: ( ( rule__JvmTypeReference__Group_0__0 ) )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1285:1: ( rule__JvmTypeReference__Group_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); 
+                    }
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1286:1: ( rule__JvmTypeReference__Group_0__0 )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1286:2: rule__JvmTypeReference__Group_0__0
+                    {
+                    pushFollow(FOLLOW_rule__JvmTypeReference__Group_0__0_in_rule__JvmTypeReference__Alternatives2718);
+                    rule__JvmTypeReference__Group_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1290:6: ( ruleXFunctionTypeRef )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1290:6: ( ruleXFunctionTypeRef )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1291:1: ruleXFunctionTypeRef
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_ruleXFunctionTypeRef_in_rule__JvmTypeReference__Alternatives2736);
+                    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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1301:1: rule__JvmArgumentTypeReference__Alternatives : ( ( ruleJvmTypeReference ) | ( ruleJvmWildcardTypeReference ) );
+    public final void rule__JvmArgumentTypeReference__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1305: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 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1306:1: ( ruleJvmTypeReference )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1306:1: ( ruleJvmTypeReference )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1307:1: ruleJvmTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_ruleJvmTypeReference_in_rule__JvmArgumentTypeReference__Alternatives2768);
+                    ruleJvmTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1312:6: ( ruleJvmWildcardTypeReference )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1312:6: ( ruleJvmWildcardTypeReference )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1313:1: ruleJvmWildcardTypeReference
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_ruleJvmWildcardTypeReference_in_rule__JvmArgumentTypeReference__Alternatives2785);
+                    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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1323: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1327: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 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1328:1: ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1328:1: ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1329:1: ( rule__JvmWildcardTypeReference__Group_2_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); 
+                    }
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1330:1: ( rule__JvmWildcardTypeReference__Group_2_0__0 )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1330:2: rule__JvmWildcardTypeReference__Group_2_0__0
+                    {
+                    pushFollow(FOLLOW_rule__JvmWildcardTypeReference__Group_2_0__0_in_rule__JvmWildcardTypeReference__Alternatives_22817);
+                    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 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1334:6: ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1334:6: ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1335:1: ( rule__JvmWildcardTypeReference__Group_2_1__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); 
+                    }
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1336:1: ( rule__JvmWildcardTypeReference__Group_2_1__0 )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1336:2: rule__JvmWildcardTypeReference__Group_2_1__0
+                    {
+                    pushFollow(FOLLOW_rule__JvmWildcardTypeReference__Group_2_1__0_in_rule__JvmWildcardTypeReference__Alternatives_22835);
+                    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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1345: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1349: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 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1350:1: ( ( rule__XImportDeclaration__Group_1_0__0 ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1350:1: ( ( rule__XImportDeclaration__Group_1_0__0 ) )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1351:1: ( rule__XImportDeclaration__Group_1_0__0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getGroup_1_0()); 
+                    }
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1352:1: ( rule__XImportDeclaration__Group_1_0__0 )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1352:2: rule__XImportDeclaration__Group_1_0__0
+                    {
+                    pushFollow(FOLLOW_rule__XImportDeclaration__Group_1_0__0_in_rule__XImportDeclaration__Alternatives_12868);
+                    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 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1356:6: ( ( rule__XImportDeclaration__ImportedTypeAssignment_1_1 ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1356:6: ( ( rule__XImportDeclaration__ImportedTypeAssignment_1_1 ) )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1357:1: ( rule__XImportDeclaration__ImportedTypeAssignment_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1()); 
+                    }
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1358:1: ( rule__XImportDeclaration__ImportedTypeAssignment_1_1 )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1358:2: rule__XImportDeclaration__ImportedTypeAssignment_1_1
+                    {
+                    pushFollow(FOLLOW_rule__XImportDeclaration__ImportedTypeAssignment_1_1_in_rule__XImportDeclaration__Alternatives_12886);
+                    rule__XImportDeclaration__ImportedTypeAssignment_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1362:6: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_1_2 ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1362:6: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_1_2 ) )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1363:1: ( rule__XImportDeclaration__ImportedNamespaceAssignment_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_1_2()); 
+                    }
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1364:1: ( rule__XImportDeclaration__ImportedNamespaceAssignment_1_2 )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1364:2: rule__XImportDeclaration__ImportedNamespaceAssignment_1_2
+                    {
+                    pushFollow(FOLLOW_rule__XImportDeclaration__ImportedNamespaceAssignment_1_2_in_rule__XImportDeclaration__Alternatives_12904);
+                    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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1373: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1377: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 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1378:1: ( ( rule__XImportDeclaration__WildcardAssignment_1_0_3_0 ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1378:1: ( ( rule__XImportDeclaration__WildcardAssignment_1_0_3_0 ) )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1379:1: ( rule__XImportDeclaration__WildcardAssignment_1_0_3_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_1_0_3_0()); 
+                    }
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1380:1: ( rule__XImportDeclaration__WildcardAssignment_1_0_3_0 )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1380:2: rule__XImportDeclaration__WildcardAssignment_1_0_3_0
+                    {
+                    pushFollow(FOLLOW_rule__XImportDeclaration__WildcardAssignment_1_0_3_0_in_rule__XImportDeclaration__Alternatives_1_0_32937);
+                    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 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1384:6: ( ( rule__XImportDeclaration__MemberNameAssignment_1_0_3_1 ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1384:6: ( ( rule__XImportDeclaration__MemberNameAssignment_1_0_3_1 ) )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1385:1: ( rule__XImportDeclaration__MemberNameAssignment_1_0_3_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_1_0_3_1()); 
+                    }
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1386:1: ( rule__XImportDeclaration__MemberNameAssignment_1_0_3_1 )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1386:2: rule__XImportDeclaration__MemberNameAssignment_1_0_3_1
+                    {
+                    pushFollow(FOLLOW_rule__XImportDeclaration__MemberNameAssignment_1_0_3_1_in_rule__XImportDeclaration__Alternatives_1_0_32955);
+                    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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1395: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1399: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 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1400:1: ( ( 'equal' ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1400:1: ( ( 'equal' ) )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1401:1: ( 'equal' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0()); 
+                    }
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1402:1: ( 'equal' )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1402:3: 'equal'
+                    {
+                    match(input,15,FOLLOW_15_in_rule__StyleCompare__Alternatives2989); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1407:6: ( ( 'greater equal' ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1407:6: ( ( 'greater equal' ) )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1408:1: ( 'greater equal' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1()); 
+                    }
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1409:1: ( 'greater equal' )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1409:3: 'greater equal'
+                    {
+                    match(input,16,FOLLOW_16_in_rule__StyleCompare__Alternatives3010); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1414:6: ( ( 'greater than' ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1414:6: ( ( 'greater than' ) )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1415:1: ( 'greater than' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2()); 
+                    }
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1416:1: ( 'greater than' )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1416:3: 'greater than'
+                    {
+                    match(input,17,FOLLOW_17_in_rule__StyleCompare__Alternatives3031); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1421:6: ( ( 'lower equal' ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1421:6: ( ( 'lower equal' ) )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1422:1: ( 'lower equal' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3()); 
+                    }
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1423:1: ( 'lower equal' )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1423:3: 'lower equal'
+                    {
+                    match(input,18,FOLLOW_18_in_rule__StyleCompare__Alternatives3052); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1428:6: ( ( 'lower than' ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1428:6: ( ( 'lower than' ) )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1429:1: ( 'lower than' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4()); 
+                    }
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1430:1: ( 'lower than' )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1430:3: 'lower than'
+                    {
+                    match(input,19,FOLLOW_19_in_rule__StyleCompare__Alternatives3073); if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 6 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1435:6: ( ( 'not equal' ) )
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1435:6: ( ( 'not equal' ) )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1436:1: ( 'not equal' )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5()); 
+                    }
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1437:1: ( 'not equal' )
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1437:3: 'not equal'
+                    {
+                    match(input,20,FOLLOW_20_in_rule__StyleCompare__Alternatives3094); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1449: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1453:1: ( rule__Source__Group__0__Impl rule__Source__Group__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1454:2: rule__Source__Group__0__Impl rule__Source__Group__1
+            {
+            pushFollow(FOLLOW_rule__Source__Group__0__Impl_in_rule__Source__Group__03127);
+            rule__Source__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Source__Group__1_in_rule__Source__Group__03130);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1461:1: rule__Source__Group__0__Impl : ( 'gridsource' ) ;
+    public final void rule__Source__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1465:1: ( ( 'gridsource' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1466:1: ( 'gridsource' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1466:1: ( 'gridsource' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1467:1: 'gridsource'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getGridsourceKeyword_0()); 
+            }
+            match(input,21,FOLLOW_21_in_rule__Source__Group__0__Impl3158); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1480: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1484:1: ( rule__Source__Group__1__Impl rule__Source__Group__2 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1485:2: rule__Source__Group__1__Impl rule__Source__Group__2
+            {
+            pushFollow(FOLLOW_rule__Source__Group__1__Impl_in_rule__Source__Group__13189);
+            rule__Source__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Source__Group__2_in_rule__Source__Group__13192);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1492:1: rule__Source__Group__1__Impl : ( ( rule__Source__IdAssignment_1 ) ) ;
+    public final void rule__Source__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1496:1: ( ( ( rule__Source__IdAssignment_1 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1497:1: ( ( rule__Source__IdAssignment_1 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1497:1: ( ( rule__Source__IdAssignment_1 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1498:1: ( rule__Source__IdAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getIdAssignment_1()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1499:1: ( rule__Source__IdAssignment_1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1499:2: rule__Source__IdAssignment_1
+            {
+            pushFollow(FOLLOW_rule__Source__IdAssignment_1_in_rule__Source__Group__1__Impl3219);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1509: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1513:1: ( rule__Source__Group__2__Impl rule__Source__Group__3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1514:2: rule__Source__Group__2__Impl rule__Source__Group__3
+            {
+            pushFollow(FOLLOW_rule__Source__Group__2__Impl_in_rule__Source__Group__23249);
+            rule__Source__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Source__Group__3_in_rule__Source__Group__23252);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1521:1: rule__Source__Group__2__Impl : ( 'for' ) ;
+    public final void rule__Source__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1525:1: ( ( 'for' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1526:1: ( 'for' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1526:1: ( 'for' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1527:1: 'for'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getForKeyword_2()); 
+            }
+            match(input,22,FOLLOW_22_in_rule__Source__Group__2__Impl3280); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1540: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1544:1: ( rule__Source__Group__3__Impl rule__Source__Group__4 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1545:2: rule__Source__Group__3__Impl rule__Source__Group__4
+            {
+            pushFollow(FOLLOW_rule__Source__Group__3__Impl_in_rule__Source__Group__33311);
+            rule__Source__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Source__Group__4_in_rule__Source__Group__33314);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1552:1: rule__Source__Group__3__Impl : ( ( rule__Source__RootTypeAssignment_3 ) ) ;
+    public final void rule__Source__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1556:1: ( ( ( rule__Source__RootTypeAssignment_3 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1557:1: ( ( rule__Source__RootTypeAssignment_3 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1557:1: ( ( rule__Source__RootTypeAssignment_3 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1558:1: ( rule__Source__RootTypeAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getRootTypeAssignment_3()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1559:1: ( rule__Source__RootTypeAssignment_3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1559:2: rule__Source__RootTypeAssignment_3
+            {
+            pushFollow(FOLLOW_rule__Source__RootTypeAssignment_3_in_rule__Source__Group__3__Impl3341);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1569: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1573:1: ( rule__Source__Group__4__Impl rule__Source__Group__5 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1574:2: rule__Source__Group__4__Impl rule__Source__Group__5
+            {
+            pushFollow(FOLLOW_rule__Source__Group__4__Impl_in_rule__Source__Group__43371);
+            rule__Source__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Source__Group__5_in_rule__Source__Group__43374);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1581:1: rule__Source__Group__4__Impl : ( '{' ) ;
+    public final void rule__Source__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1585:1: ( ( '{' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1586:1: ( '{' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1586:1: ( '{' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1587:1: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_4()); 
+            }
+            match(input,23,FOLLOW_23_in_rule__Source__Group__4__Impl3402); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1600: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1604:1: ( rule__Source__Group__5__Impl rule__Source__Group__6 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1605:2: rule__Source__Group__5__Impl rule__Source__Group__6
+            {
+            pushFollow(FOLLOW_rule__Source__Group__5__Impl_in_rule__Source__Group__53433);
+            rule__Source__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Source__Group__6_in_rule__Source__Group__53436);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1612:1: rule__Source__Group__5__Impl : ( 'inputs' ) ;
+    public final void rule__Source__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1616:1: ( ( 'inputs' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1617:1: ( 'inputs' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1617:1: ( 'inputs' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1618:1: 'inputs'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getInputsKeyword_5()); 
+            }
+            match(input,24,FOLLOW_24_in_rule__Source__Group__5__Impl3464); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1631: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1635:1: ( rule__Source__Group__6__Impl rule__Source__Group__7 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1636:2: rule__Source__Group__6__Impl rule__Source__Group__7
+            {
+            pushFollow(FOLLOW_rule__Source__Group__6__Impl_in_rule__Source__Group__63495);
+            rule__Source__Group__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Source__Group__7_in_rule__Source__Group__63498);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1643:1: rule__Source__Group__6__Impl : ( '{' ) ;
+    public final void rule__Source__Group__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1647:1: ( ( '{' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1648:1: ( '{' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1648:1: ( '{' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1649:1: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_6()); 
+            }
+            match(input,23,FOLLOW_23_in_rule__Source__Group__6__Impl3526); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1662: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1666:1: ( rule__Source__Group__7__Impl rule__Source__Group__8 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1667:2: rule__Source__Group__7__Impl rule__Source__Group__8
+            {
+            pushFollow(FOLLOW_rule__Source__Group__7__Impl_in_rule__Source__Group__73557);
+            rule__Source__Group__7__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Source__Group__8_in_rule__Source__Group__73560);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1674:1: rule__Source__Group__7__Impl : ( ( rule__Source__InputsAssignment_7 )* ) ;
+    public final void rule__Source__Group__7__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1678:1: ( ( ( rule__Source__InputsAssignment_7 )* ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1679:1: ( ( rule__Source__InputsAssignment_7 )* )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1679:1: ( ( rule__Source__InputsAssignment_7 )* )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1680:1: ( rule__Source__InputsAssignment_7 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getInputsAssignment_7()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1681:1: ( 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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1681:2: rule__Source__InputsAssignment_7
+            	    {
+            	    pushFollow(FOLLOW_rule__Source__InputsAssignment_7_in_rule__Source__Group__7__Impl3587);
+            	    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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1691: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1695:1: ( rule__Source__Group__8__Impl rule__Source__Group__9 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1696:2: rule__Source__Group__8__Impl rule__Source__Group__9
+            {
+            pushFollow(FOLLOW_rule__Source__Group__8__Impl_in_rule__Source__Group__83618);
+            rule__Source__Group__8__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Source__Group__9_in_rule__Source__Group__83621);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1703:1: rule__Source__Group__8__Impl : ( '}' ) ;
+    public final void rule__Source__Group__8__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1707:1: ( ( '}' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1708:1: ( '}' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1708:1: ( '}' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1709:1: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_8()); 
+            }
+            match(input,25,FOLLOW_25_in_rule__Source__Group__8__Impl3649); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1722: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1726:1: ( rule__Source__Group__9__Impl rule__Source__Group__10 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1727:2: rule__Source__Group__9__Impl rule__Source__Group__10
+            {
+            pushFollow(FOLLOW_rule__Source__Group__9__Impl_in_rule__Source__Group__93680);
+            rule__Source__Group__9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Source__Group__10_in_rule__Source__Group__93683);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1734:1: rule__Source__Group__9__Impl : ( ( rule__Source__PropertiesAssignment_9 )* ) ;
+    public final void rule__Source__Group__9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1738:1: ( ( ( rule__Source__PropertiesAssignment_9 )* ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1739:1: ( ( rule__Source__PropertiesAssignment_9 )* )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1739:1: ( ( rule__Source__PropertiesAssignment_9 )* )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1740:1: ( rule__Source__PropertiesAssignment_9 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getPropertiesAssignment_9()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1741:1: ( 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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1741:2: rule__Source__PropertiesAssignment_9
+            	    {
+            	    pushFollow(FOLLOW_rule__Source__PropertiesAssignment_9_in_rule__Source__Group__9__Impl3710);
+            	    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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1751:1: rule__Source__Group__10 : rule__Source__Group__10__Impl ;
+    public final void rule__Source__Group__10() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1755:1: ( rule__Source__Group__10__Impl )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1756:2: rule__Source__Group__10__Impl
+            {
+            pushFollow(FOLLOW_rule__Source__Group__10__Impl_in_rule__Source__Group__103741);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1762:1: rule__Source__Group__10__Impl : ( '}' ) ;
+    public final void rule__Source__Group__10__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1766:1: ( ( '}' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1767:1: ( '}' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1767:1: ( '}' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1768:1: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_10()); 
+            }
+            match(input,25,FOLLOW_25_in_rule__Source__Group__10__Impl3769); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1803: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1807:1: ( rule__Input__Group__0__Impl rule__Input__Group__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1808:2: rule__Input__Group__0__Impl rule__Input__Group__1
+            {
+            pushFollow(FOLLOW_rule__Input__Group__0__Impl_in_rule__Input__Group__03822);
+            rule__Input__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Input__Group__1_in_rule__Input__Group__03825);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1815:1: rule__Input__Group__0__Impl : ( 'inputType' ) ;
+    public final void rule__Input__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1819:1: ( ( 'inputType' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1820:1: ( 'inputType' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1820:1: ( 'inputType' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1821:1: 'inputType'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getInputTypeKeyword_0()); 
+            }
+            match(input,26,FOLLOW_26_in_rule__Input__Group__0__Impl3853); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1834: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1838:1: ( rule__Input__Group__1__Impl rule__Input__Group__2 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1839:2: rule__Input__Group__1__Impl rule__Input__Group__2
+            {
+            pushFollow(FOLLOW_rule__Input__Group__1__Impl_in_rule__Input__Group__13884);
+            rule__Input__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Input__Group__2_in_rule__Input__Group__13887);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1846:1: rule__Input__Group__1__Impl : ( ( rule__Input__InputTypeAssignment_1 ) ) ;
+    public final void rule__Input__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1850:1: ( ( ( rule__Input__InputTypeAssignment_1 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1851:1: ( ( rule__Input__InputTypeAssignment_1 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1851:1: ( ( rule__Input__InputTypeAssignment_1 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1852:1: ( rule__Input__InputTypeAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getInputTypeAssignment_1()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1853:1: ( rule__Input__InputTypeAssignment_1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1853:2: rule__Input__InputTypeAssignment_1
+            {
+            pushFollow(FOLLOW_rule__Input__InputTypeAssignment_1_in_rule__Input__Group__1__Impl3914);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1863: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1867:1: ( rule__Input__Group__2__Impl rule__Input__Group__3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1868:2: rule__Input__Group__2__Impl rule__Input__Group__3
+            {
+            pushFollow(FOLLOW_rule__Input__Group__2__Impl_in_rule__Input__Group__23944);
+            rule__Input__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Input__Group__3_in_rule__Input__Group__23947);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1875:1: rule__Input__Group__2__Impl : ( 'filters' ) ;
+    public final void rule__Input__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1879:1: ( ( 'filters' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1880:1: ( 'filters' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1880:1: ( 'filters' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1881:1: 'filters'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getFiltersKeyword_2()); 
+            }
+            match(input,27,FOLLOW_27_in_rule__Input__Group__2__Impl3975); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1894: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1898:1: ( rule__Input__Group__3__Impl rule__Input__Group__4 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1899:2: rule__Input__Group__3__Impl rule__Input__Group__4
+            {
+            pushFollow(FOLLOW_rule__Input__Group__3__Impl_in_rule__Input__Group__34006);
+            rule__Input__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Input__Group__4_in_rule__Input__Group__34009);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1906:1: rule__Input__Group__3__Impl : ( ( rule__Input__FiltersAssignment_3 ) ) ;
+    public final void rule__Input__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1910:1: ( ( ( rule__Input__FiltersAssignment_3 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1911:1: ( ( rule__Input__FiltersAssignment_3 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1911:1: ( ( rule__Input__FiltersAssignment_3 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1912:1: ( rule__Input__FiltersAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getFiltersAssignment_3()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1913:1: ( rule__Input__FiltersAssignment_3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1913:2: rule__Input__FiltersAssignment_3
+            {
+            pushFollow(FOLLOW_rule__Input__FiltersAssignment_3_in_rule__Input__Group__3__Impl4036);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1923:1: rule__Input__Group__4 : rule__Input__Group__4__Impl ;
+    public final void rule__Input__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1927:1: ( rule__Input__Group__4__Impl )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1928:2: rule__Input__Group__4__Impl
+            {
+            pushFollow(FOLLOW_rule__Input__Group__4__Impl_in_rule__Input__Group__44066);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1934: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1938:1: ( ( ( rule__Input__Group_4__0 )* ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1939:1: ( ( rule__Input__Group_4__0 )* )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1939:1: ( ( rule__Input__Group_4__0 )* )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1940:1: ( rule__Input__Group_4__0 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getGroup_4()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1941:1: ( 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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1941:2: rule__Input__Group_4__0
+            	    {
+            	    pushFollow(FOLLOW_rule__Input__Group_4__0_in_rule__Input__Group__4__Impl4093);
+            	    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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1961: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1965:1: ( rule__Input__Group_4__0__Impl rule__Input__Group_4__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1966:2: rule__Input__Group_4__0__Impl rule__Input__Group_4__1
+            {
+            pushFollow(FOLLOW_rule__Input__Group_4__0__Impl_in_rule__Input__Group_4__04134);
+            rule__Input__Group_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Input__Group_4__1_in_rule__Input__Group_4__04137);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1973:1: rule__Input__Group_4__0__Impl : ( '&&' ) ;
+    public final void rule__Input__Group_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1977:1: ( ( '&&' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1978:1: ( '&&' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1978:1: ( '&&' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1979:1: '&&'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getAmpersandAmpersandKeyword_4_0()); 
+            }
+            match(input,28,FOLLOW_28_in_rule__Input__Group_4__0__Impl4165); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1992: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1996:1: ( rule__Input__Group_4__1__Impl )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:1997:2: rule__Input__Group_4__1__Impl
+            {
+            pushFollow(FOLLOW_rule__Input__Group_4__1__Impl_in_rule__Input__Group_4__14196);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2003: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2007:1: ( ( ( rule__Input__FiltersAssignment_4_1 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2008:1: ( ( rule__Input__FiltersAssignment_4_1 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2008:1: ( ( rule__Input__FiltersAssignment_4_1 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2009:1: ( rule__Input__FiltersAssignment_4_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getInputAccess().getFiltersAssignment_4_1()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2010:1: ( rule__Input__FiltersAssignment_4_1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2010:2: rule__Input__FiltersAssignment_4_1
+            {
+            pushFollow(FOLLOW_rule__Input__FiltersAssignment_4_1_in_rule__Input__Group_4__1__Impl4223);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2024: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2028:1: ( rule__EQFilter__Group__0__Impl rule__EQFilter__Group__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2029:2: rule__EQFilter__Group__0__Impl rule__EQFilter__Group__1
+            {
+            pushFollow(FOLLOW_rule__EQFilter__Group__0__Impl_in_rule__EQFilter__Group__04257);
+            rule__EQFilter__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__EQFilter__Group__1_in_rule__EQFilter__Group__04260);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2036:1: rule__EQFilter__Group__0__Impl : ( () ) ;
+    public final void rule__EQFilter__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2040:1: ( ( () ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2041:1: ( () )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2041:1: ( () )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2042:1: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getCxGridSourceEQFilterAction_0()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2043:1: ()
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2045:1: 
+            {
+            }
+
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2055: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2059:1: ( rule__EQFilter__Group__1__Impl rule__EQFilter__Group__2 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2060:2: rule__EQFilter__Group__1__Impl rule__EQFilter__Group__2
+            {
+            pushFollow(FOLLOW_rule__EQFilter__Group__1__Impl_in_rule__EQFilter__Group__14318);
+            rule__EQFilter__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__EQFilter__Group__2_in_rule__EQFilter__Group__14321);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2067:1: rule__EQFilter__Group__1__Impl : ( 'root:' ) ;
+    public final void rule__EQFilter__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2071:1: ( ( 'root:' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2072:1: ( 'root:' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2072:1: ( 'root:' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2073:1: 'root:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getRootKeyword_1()); 
+            }
+            match(input,29,FOLLOW_29_in_rule__EQFilter__Group__1__Impl4349); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2086: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2090:1: ( rule__EQFilter__Group__2__Impl rule__EQFilter__Group__3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2091:2: rule__EQFilter__Group__2__Impl rule__EQFilter__Group__3
+            {
+            pushFollow(FOLLOW_rule__EQFilter__Group__2__Impl_in_rule__EQFilter__Group__24380);
+            rule__EQFilter__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__EQFilter__Group__3_in_rule__EQFilter__Group__24383);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2098:1: rule__EQFilter__Group__2__Impl : ( ( rule__EQFilter__RootTypePropertyPathAssignment_2 ) ) ;
+    public final void rule__EQFilter__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2102:1: ( ( ( rule__EQFilter__RootTypePropertyPathAssignment_2 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2103:1: ( ( rule__EQFilter__RootTypePropertyPathAssignment_2 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2103:1: ( ( rule__EQFilter__RootTypePropertyPathAssignment_2 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2104:1: ( rule__EQFilter__RootTypePropertyPathAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getRootTypePropertyPathAssignment_2()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2105:1: ( rule__EQFilter__RootTypePropertyPathAssignment_2 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2105:2: rule__EQFilter__RootTypePropertyPathAssignment_2
+            {
+            pushFollow(FOLLOW_rule__EQFilter__RootTypePropertyPathAssignment_2_in_rule__EQFilter__Group__2__Impl4410);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2115: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2119:1: ( rule__EQFilter__Group__3__Impl rule__EQFilter__Group__4 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2120:2: rule__EQFilter__Group__3__Impl rule__EQFilter__Group__4
+            {
+            pushFollow(FOLLOW_rule__EQFilter__Group__3__Impl_in_rule__EQFilter__Group__34440);
+            rule__EQFilter__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__EQFilter__Group__4_in_rule__EQFilter__Group__34443);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2127:1: rule__EQFilter__Group__3__Impl : ( '=' ) ;
+    public final void rule__EQFilter__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2131:1: ( ( '=' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2132:1: ( '=' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2132:1: ( '=' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2133:1: '='
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getEqualsSignKeyword_3()); 
+            }
+            match(input,30,FOLLOW_30_in_rule__EQFilter__Group__3__Impl4471); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2146: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2150:1: ( rule__EQFilter__Group__4__Impl rule__EQFilter__Group__5 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2151:2: rule__EQFilter__Group__4__Impl rule__EQFilter__Group__5
+            {
+            pushFollow(FOLLOW_rule__EQFilter__Group__4__Impl_in_rule__EQFilter__Group__44502);
+            rule__EQFilter__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__EQFilter__Group__5_in_rule__EQFilter__Group__44505);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2158:1: rule__EQFilter__Group__4__Impl : ( 'input:' ) ;
+    public final void rule__EQFilter__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2162:1: ( ( 'input:' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2163:1: ( 'input:' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2163:1: ( 'input:' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2164:1: 'input:'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getInputKeyword_4()); 
+            }
+            match(input,31,FOLLOW_31_in_rule__EQFilter__Group__4__Impl4533); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2177:1: rule__EQFilter__Group__5 : rule__EQFilter__Group__5__Impl ;
+    public final void rule__EQFilter__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2181:1: ( rule__EQFilter__Group__5__Impl )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2182:2: rule__EQFilter__Group__5__Impl
+            {
+            pushFollow(FOLLOW_rule__EQFilter__Group__5__Impl_in_rule__EQFilter__Group__54564);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2188:1: rule__EQFilter__Group__5__Impl : ( ( rule__EQFilter__InputTypePropertyPathAssignment_5 ) ) ;
+    public final void rule__EQFilter__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2192:1: ( ( ( rule__EQFilter__InputTypePropertyPathAssignment_5 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2193:1: ( ( rule__EQFilter__InputTypePropertyPathAssignment_5 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2193:1: ( ( rule__EQFilter__InputTypePropertyPathAssignment_5 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2194:1: ( rule__EQFilter__InputTypePropertyPathAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getEQFilterAccess().getInputTypePropertyPathAssignment_5()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2195:1: ( rule__EQFilter__InputTypePropertyPathAssignment_5 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2195:2: rule__EQFilter__InputTypePropertyPathAssignment_5
+            {
+            pushFollow(FOLLOW_rule__EQFilter__InputTypePropertyPathAssignment_5_in_rule__EQFilter__Group__5__Impl4591);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2217: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2221:1: ( rule__Property__Group__0__Impl rule__Property__Group__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2222:2: rule__Property__Group__0__Impl rule__Property__Group__1
+            {
+            pushFollow(FOLLOW_rule__Property__Group__0__Impl_in_rule__Property__Group__04633);
+            rule__Property__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Property__Group__1_in_rule__Property__Group__04636);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2229:1: rule__Property__Group__0__Impl : ( 'prop' ) ;
+    public final void rule__Property__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2233:1: ( ( 'prop' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2234:1: ( 'prop' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2234:1: ( 'prop' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2235:1: 'prop'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyAccess().getPropKeyword_0()); 
+            }
+            match(input,32,FOLLOW_32_in_rule__Property__Group__0__Impl4664); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2248: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2252:1: ( rule__Property__Group__1__Impl rule__Property__Group__2 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2253:2: rule__Property__Group__1__Impl rule__Property__Group__2
+            {
+            pushFollow(FOLLOW_rule__Property__Group__1__Impl_in_rule__Property__Group__14695);
+            rule__Property__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Property__Group__2_in_rule__Property__Group__14698);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2260:1: rule__Property__Group__1__Impl : ( ( rule__Property__PathAssignment_1 ) ) ;
+    public final void rule__Property__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2264:1: ( ( ( rule__Property__PathAssignment_1 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2265:1: ( ( rule__Property__PathAssignment_1 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2265:1: ( ( rule__Property__PathAssignment_1 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2266:1: ( rule__Property__PathAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyAccess().getPathAssignment_1()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2267:1: ( rule__Property__PathAssignment_1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2267:2: rule__Property__PathAssignment_1
+            {
+            pushFollow(FOLLOW_rule__Property__PathAssignment_1_in_rule__Property__Group__1__Impl4725);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2277: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2281:1: ( rule__Property__Group__2__Impl rule__Property__Group__3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2282:2: rule__Property__Group__2__Impl rule__Property__Group__3
+            {
+            pushFollow(FOLLOW_rule__Property__Group__2__Impl_in_rule__Property__Group__24755);
+            rule__Property__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__Property__Group__3_in_rule__Property__Group__24758);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2289:1: rule__Property__Group__2__Impl : ( 'style' ) ;
+    public final void rule__Property__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2293:1: ( ( 'style' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2294:1: ( 'style' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2294:1: ( 'style' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2295:1: 'style'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyAccess().getStyleKeyword_2()); 
+            }
+            match(input,33,FOLLOW_33_in_rule__Property__Group__2__Impl4786); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2308:1: rule__Property__Group__3 : rule__Property__Group__3__Impl ;
+    public final void rule__Property__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2312:1: ( rule__Property__Group__3__Impl )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2313:2: rule__Property__Group__3__Impl
+            {
+            pushFollow(FOLLOW_rule__Property__Group__3__Impl_in_rule__Property__Group__34817);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2319:1: rule__Property__Group__3__Impl : ( ( rule__Property__StyleAssignment_3 ) ) ;
+    public final void rule__Property__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2323:1: ( ( ( rule__Property__StyleAssignment_3 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2324:1: ( ( rule__Property__StyleAssignment_3 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2324:1: ( ( rule__Property__StyleAssignment_3 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2325:1: ( rule__Property__StyleAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyAccess().getStyleAssignment_3()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2326:1: ( rule__Property__StyleAssignment_3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2326:2: rule__Property__StyleAssignment_3
+            {
+            pushFollow(FOLLOW_rule__Property__StyleAssignment_3_in_rule__Property__Group__3__Impl4844);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2344: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2348:1: ( rule__NestedField__Group__0__Impl rule__NestedField__Group__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2349:2: rule__NestedField__Group__0__Impl rule__NestedField__Group__1
+            {
+            pushFollow(FOLLOW_rule__NestedField__Group__0__Impl_in_rule__NestedField__Group__04882);
+            rule__NestedField__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__NestedField__Group__1_in_rule__NestedField__Group__04885);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2356:1: rule__NestedField__Group__0__Impl : ( () ) ;
+    public final void rule__NestedField__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2360:1: ( ( () ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2361:1: ( () )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2361:1: ( () )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2362:1: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedFieldAccess().getCxGridNestedFieldAction_0()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2363:1: ()
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2365:1: 
+            {
+            }
+
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2375: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2379:1: ( rule__NestedField__Group__1__Impl rule__NestedField__Group__2 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2380:2: rule__NestedField__Group__1__Impl rule__NestedField__Group__2
+            {
+            pushFollow(FOLLOW_rule__NestedField__Group__1__Impl_in_rule__NestedField__Group__14943);
+            rule__NestedField__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__NestedField__Group__2_in_rule__NestedField__Group__14946);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2387:1: rule__NestedField__Group__1__Impl : ( ( rule__NestedField__FieldAssignment_1 ) ) ;
+    public final void rule__NestedField__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2391:1: ( ( ( rule__NestedField__FieldAssignment_1 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2392:1: ( ( rule__NestedField__FieldAssignment_1 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2392:1: ( ( rule__NestedField__FieldAssignment_1 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2393:1: ( rule__NestedField__FieldAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedFieldAccess().getFieldAssignment_1()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2394:1: ( rule__NestedField__FieldAssignment_1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2394:2: rule__NestedField__FieldAssignment_1
+            {
+            pushFollow(FOLLOW_rule__NestedField__FieldAssignment_1_in_rule__NestedField__Group__1__Impl4973);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2404:1: rule__NestedField__Group__2 : rule__NestedField__Group__2__Impl ;
+    public final void rule__NestedField__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2408:1: ( rule__NestedField__Group__2__Impl )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2409:2: rule__NestedField__Group__2__Impl
+            {
+            pushFollow(FOLLOW_rule__NestedField__Group__2__Impl_in_rule__NestedField__Group__25003);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2415:1: rule__NestedField__Group__2__Impl : ( ( rule__NestedField__PathAssignment_2 )? ) ;
+    public final void rule__NestedField__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2419:1: ( ( ( rule__NestedField__PathAssignment_2 )? ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2420:1: ( ( rule__NestedField__PathAssignment_2 )? )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2420:1: ( ( rule__NestedField__PathAssignment_2 )? )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2421:1: ( rule__NestedField__PathAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedFieldAccess().getPathAssignment_2()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2422:1: ( rule__NestedField__PathAssignment_2 )?
+            int alt14=2;
+            int LA14_0 = input.LA(1);
+
+            if ( (LA14_0==34) ) {
+                alt14=1;
+            }
+            switch (alt14) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2422:2: rule__NestedField__PathAssignment_2
+                    {
+                    pushFollow(FOLLOW_rule__NestedField__PathAssignment_2_in_rule__NestedField__Group__2__Impl5030);
+                    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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2438: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2442:1: ( rule__NestedPath__Group__0__Impl rule__NestedPath__Group__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2443:2: rule__NestedPath__Group__0__Impl rule__NestedPath__Group__1
+            {
+            pushFollow(FOLLOW_rule__NestedPath__Group__0__Impl_in_rule__NestedPath__Group__05067);
+            rule__NestedPath__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__NestedPath__Group__1_in_rule__NestedPath__Group__05070);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2450:1: rule__NestedPath__Group__0__Impl : ( () ) ;
+    public final void rule__NestedPath__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2454:1: ( ( () ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2455:1: ( () )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2455:1: ( () )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2456:1: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathAccess().getCxGridNestedPathAction_0()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2457:1: ()
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2459:1: 
+            {
+            }
+
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2469: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2473:1: ( rule__NestedPath__Group__1__Impl rule__NestedPath__Group__2 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2474:2: rule__NestedPath__Group__1__Impl rule__NestedPath__Group__2
+            {
+            pushFollow(FOLLOW_rule__NestedPath__Group__1__Impl_in_rule__NestedPath__Group__15128);
+            rule__NestedPath__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__NestedPath__Group__2_in_rule__NestedPath__Group__15131);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2481:1: rule__NestedPath__Group__1__Impl : ( '.' ) ;
+    public final void rule__NestedPath__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2485:1: ( ( '.' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2486:1: ( '.' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2486:1: ( '.' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2487:1: '.'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathAccess().getFullStopKeyword_1()); 
+            }
+            match(input,34,FOLLOW_34_in_rule__NestedPath__Group__1__Impl5159); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2500: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2504:1: ( rule__NestedPath__Group__2__Impl rule__NestedPath__Group__3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2505:2: rule__NestedPath__Group__2__Impl rule__NestedPath__Group__3
+            {
+            pushFollow(FOLLOW_rule__NestedPath__Group__2__Impl_in_rule__NestedPath__Group__25190);
+            rule__NestedPath__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__NestedPath__Group__3_in_rule__NestedPath__Group__25193);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2512:1: rule__NestedPath__Group__2__Impl : ( ( rule__NestedPath__FieldAssignment_2 ) ) ;
+    public final void rule__NestedPath__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2516:1: ( ( ( rule__NestedPath__FieldAssignment_2 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2517:1: ( ( rule__NestedPath__FieldAssignment_2 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2517:1: ( ( rule__NestedPath__FieldAssignment_2 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2518:1: ( rule__NestedPath__FieldAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathAccess().getFieldAssignment_2()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2519:1: ( rule__NestedPath__FieldAssignment_2 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2519:2: rule__NestedPath__FieldAssignment_2
+            {
+            pushFollow(FOLLOW_rule__NestedPath__FieldAssignment_2_in_rule__NestedPath__Group__2__Impl5220);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2529:1: rule__NestedPath__Group__3 : rule__NestedPath__Group__3__Impl ;
+    public final void rule__NestedPath__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2533:1: ( rule__NestedPath__Group__3__Impl )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2534:2: rule__NestedPath__Group__3__Impl
+            {
+            pushFollow(FOLLOW_rule__NestedPath__Group__3__Impl_in_rule__NestedPath__Group__35250);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2540:1: rule__NestedPath__Group__3__Impl : ( ( rule__NestedPath__PathAssignment_3 )? ) ;
+    public final void rule__NestedPath__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2544:1: ( ( ( rule__NestedPath__PathAssignment_3 )? ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2545:1: ( ( rule__NestedPath__PathAssignment_3 )? )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2545:1: ( ( rule__NestedPath__PathAssignment_3 )? )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2546:1: ( rule__NestedPath__PathAssignment_3 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getNestedPathAccess().getPathAssignment_3()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2547:1: ( rule__NestedPath__PathAssignment_3 )?
+            int alt15=2;
+            int LA15_0 = input.LA(1);
+
+            if ( (LA15_0==34) ) {
+                alt15=1;
+            }
+            switch (alt15) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2547:2: rule__NestedPath__PathAssignment_3
+                    {
+                    pushFollow(FOLLOW_rule__NestedPath__PathAssignment_3_in_rule__NestedPath__Group__3__Impl5277);
+                    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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2565: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2569:1: ( rule__PropertyButtonStyle__Group__0__Impl rule__PropertyButtonStyle__Group__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2570:2: rule__PropertyButtonStyle__Group__0__Impl rule__PropertyButtonStyle__Group__1
+            {
+            pushFollow(FOLLOW_rule__PropertyButtonStyle__Group__0__Impl_in_rule__PropertyButtonStyle__Group__05316);
+            rule__PropertyButtonStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyButtonStyle__Group__1_in_rule__PropertyButtonStyle__Group__05319);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2577:1: rule__PropertyButtonStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyButtonStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2581:1: ( ( () ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2582:1: ( () )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2582:1: ( () )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2583:1: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyButtonStyleAccess().getCxGridPropButtonStyleAction_0()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2584:1: ()
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2586:1: 
+            {
+            }
+
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2596: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2600:1: ( rule__PropertyButtonStyle__Group__1__Impl rule__PropertyButtonStyle__Group__2 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2601:2: rule__PropertyButtonStyle__Group__1__Impl rule__PropertyButtonStyle__Group__2
+            {
+            pushFollow(FOLLOW_rule__PropertyButtonStyle__Group__1__Impl_in_rule__PropertyButtonStyle__Group__15377);
+            rule__PropertyButtonStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyButtonStyle__Group__2_in_rule__PropertyButtonStyle__Group__15380);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2608:1: rule__PropertyButtonStyle__Group__1__Impl : ( 'buttonStyle' ) ;
+    public final void rule__PropertyButtonStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2612:1: ( ( 'buttonStyle' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2613:1: ( 'buttonStyle' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2613:1: ( 'buttonStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2614:1: 'buttonStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyButtonStyleAccess().getButtonStyleKeyword_1()); 
+            }
+            match(input,35,FOLLOW_35_in_rule__PropertyButtonStyle__Group__1__Impl5408); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2627: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2631:1: ( rule__PropertyButtonStyle__Group__2__Impl rule__PropertyButtonStyle__Group__3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2632:2: rule__PropertyButtonStyle__Group__2__Impl rule__PropertyButtonStyle__Group__3
+            {
+            pushFollow(FOLLOW_rule__PropertyButtonStyle__Group__2__Impl_in_rule__PropertyButtonStyle__Group__25439);
+            rule__PropertyButtonStyle__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyButtonStyle__Group__3_in_rule__PropertyButtonStyle__Group__25442);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2639:1: rule__PropertyButtonStyle__Group__2__Impl : ( 'eventTopic' ) ;
+    public final void rule__PropertyButtonStyle__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2643:1: ( ( 'eventTopic' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2644:1: ( 'eventTopic' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2644:1: ( 'eventTopic' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2645:1: 'eventTopic'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyButtonStyleAccess().getEventTopicKeyword_2()); 
+            }
+            match(input,36,FOLLOW_36_in_rule__PropertyButtonStyle__Group__2__Impl5470); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2658:1: rule__PropertyButtonStyle__Group__3 : rule__PropertyButtonStyle__Group__3__Impl ;
+    public final void rule__PropertyButtonStyle__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2662:1: ( rule__PropertyButtonStyle__Group__3__Impl )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2663:2: rule__PropertyButtonStyle__Group__3__Impl
+            {
+            pushFollow(FOLLOW_rule__PropertyButtonStyle__Group__3__Impl_in_rule__PropertyButtonStyle__Group__35501);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2669:1: rule__PropertyButtonStyle__Group__3__Impl : ( ( rule__PropertyButtonStyle__EventTopicAssignment_3 ) ) ;
+    public final void rule__PropertyButtonStyle__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2673:1: ( ( ( rule__PropertyButtonStyle__EventTopicAssignment_3 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2674:1: ( ( rule__PropertyButtonStyle__EventTopicAssignment_3 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2674:1: ( ( rule__PropertyButtonStyle__EventTopicAssignment_3 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2675:1: ( rule__PropertyButtonStyle__EventTopicAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyButtonStyleAccess().getEventTopicAssignment_3()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2676:1: ( rule__PropertyButtonStyle__EventTopicAssignment_3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2676:2: rule__PropertyButtonStyle__EventTopicAssignment_3
+            {
+            pushFollow(FOLLOW_rule__PropertyButtonStyle__EventTopicAssignment_3_in_rule__PropertyButtonStyle__Group__3__Impl5528);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2694: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2698:1: ( rule__PropertyHtmlStyle__Group__0__Impl rule__PropertyHtmlStyle__Group__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2699:2: rule__PropertyHtmlStyle__Group__0__Impl rule__PropertyHtmlStyle__Group__1
+            {
+            pushFollow(FOLLOW_rule__PropertyHtmlStyle__Group__0__Impl_in_rule__PropertyHtmlStyle__Group__05566);
+            rule__PropertyHtmlStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyHtmlStyle__Group__1_in_rule__PropertyHtmlStyle__Group__05569);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2706:1: rule__PropertyHtmlStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyHtmlStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2710:1: ( ( () ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2711:1: ( () )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2711:1: ( () )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2712:1: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyHtmlStyleAccess().getCxGridPropHtmlStyleAction_0()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2713:1: ()
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2715:1: 
+            {
+            }
+
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2725:1: rule__PropertyHtmlStyle__Group__1 : rule__PropertyHtmlStyle__Group__1__Impl ;
+    public final void rule__PropertyHtmlStyle__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2729:1: ( rule__PropertyHtmlStyle__Group__1__Impl )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2730:2: rule__PropertyHtmlStyle__Group__1__Impl
+            {
+            pushFollow(FOLLOW_rule__PropertyHtmlStyle__Group__1__Impl_in_rule__PropertyHtmlStyle__Group__15627);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2736:1: rule__PropertyHtmlStyle__Group__1__Impl : ( 'htmlStyle' ) ;
+    public final void rule__PropertyHtmlStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2740:1: ( ( 'htmlStyle' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2741:1: ( 'htmlStyle' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2741:1: ( 'htmlStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2742:1: 'htmlStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyHtmlStyleAccess().getHtmlStyleKeyword_1()); 
+            }
+            match(input,37,FOLLOW_37_in_rule__PropertyHtmlStyle__Group__1__Impl5655); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2759: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2763:1: ( rule__PropertyBooleanStyle__Group__0__Impl rule__PropertyBooleanStyle__Group__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2764:2: rule__PropertyBooleanStyle__Group__0__Impl rule__PropertyBooleanStyle__Group__1
+            {
+            pushFollow(FOLLOW_rule__PropertyBooleanStyle__Group__0__Impl_in_rule__PropertyBooleanStyle__Group__05690);
+            rule__PropertyBooleanStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyBooleanStyle__Group__1_in_rule__PropertyBooleanStyle__Group__05693);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2771:1: rule__PropertyBooleanStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyBooleanStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2775:1: ( ( () ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2776:1: ( () )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2776:1: ( () )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2777:1: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyBooleanStyleAccess().getCxGridPropBooleanStyleAction_0()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2778:1: ()
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2780:1: 
+            {
+            }
+
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2790:1: rule__PropertyBooleanStyle__Group__1 : rule__PropertyBooleanStyle__Group__1__Impl ;
+    public final void rule__PropertyBooleanStyle__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2794:1: ( rule__PropertyBooleanStyle__Group__1__Impl )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2795:2: rule__PropertyBooleanStyle__Group__1__Impl
+            {
+            pushFollow(FOLLOW_rule__PropertyBooleanStyle__Group__1__Impl_in_rule__PropertyBooleanStyle__Group__15751);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2801:1: rule__PropertyBooleanStyle__Group__1__Impl : ( 'boolStyle' ) ;
+    public final void rule__PropertyBooleanStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2805:1: ( ( 'boolStyle' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2806:1: ( 'boolStyle' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2806:1: ( 'boolStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2807:1: 'boolStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyBooleanStyleAccess().getBoolStyleKeyword_1()); 
+            }
+            match(input,38,FOLLOW_38_in_rule__PropertyBooleanStyle__Group__1__Impl5779); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2824: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2828:1: ( rule__PropertyDateStyle__Group__0__Impl rule__PropertyDateStyle__Group__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2829:2: rule__PropertyDateStyle__Group__0__Impl rule__PropertyDateStyle__Group__1
+            {
+            pushFollow(FOLLOW_rule__PropertyDateStyle__Group__0__Impl_in_rule__PropertyDateStyle__Group__05814);
+            rule__PropertyDateStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyDateStyle__Group__1_in_rule__PropertyDateStyle__Group__05817);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2836:1: rule__PropertyDateStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyDateStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2840:1: ( ( () ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2841:1: ( () )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2841:1: ( () )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2842:1: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyDateStyleAccess().getCxGridPropDateStyleAction_0()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2843:1: ()
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2845:1: 
+            {
+            }
+
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2855: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2859:1: ( rule__PropertyDateStyle__Group__1__Impl rule__PropertyDateStyle__Group__2 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2860:2: rule__PropertyDateStyle__Group__1__Impl rule__PropertyDateStyle__Group__2
+            {
+            pushFollow(FOLLOW_rule__PropertyDateStyle__Group__1__Impl_in_rule__PropertyDateStyle__Group__15875);
+            rule__PropertyDateStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyDateStyle__Group__2_in_rule__PropertyDateStyle__Group__15878);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2867:1: rule__PropertyDateStyle__Group__1__Impl : ( 'dateStyle' ) ;
+    public final void rule__PropertyDateStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2871:1: ( ( 'dateStyle' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2872:1: ( 'dateStyle' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2872:1: ( 'dateStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2873:1: 'dateStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyDateStyleAccess().getDateStyleKeyword_1()); 
+            }
+            match(input,39,FOLLOW_39_in_rule__PropertyDateStyle__Group__1__Impl5906); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2886: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2890:1: ( rule__PropertyDateStyle__Group__2__Impl rule__PropertyDateStyle__Group__3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2891:2: rule__PropertyDateStyle__Group__2__Impl rule__PropertyDateStyle__Group__3
+            {
+            pushFollow(FOLLOW_rule__PropertyDateStyle__Group__2__Impl_in_rule__PropertyDateStyle__Group__25937);
+            rule__PropertyDateStyle__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyDateStyle__Group__3_in_rule__PropertyDateStyle__Group__25940);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2898:1: rule__PropertyDateStyle__Group__2__Impl : ( 'format' ) ;
+    public final void rule__PropertyDateStyle__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2902:1: ( ( 'format' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2903:1: ( 'format' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2903:1: ( 'format' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2904:1: 'format'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyDateStyleAccess().getFormatKeyword_2()); 
+            }
+            match(input,40,FOLLOW_40_in_rule__PropertyDateStyle__Group__2__Impl5968); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2917:1: rule__PropertyDateStyle__Group__3 : rule__PropertyDateStyle__Group__3__Impl ;
+    public final void rule__PropertyDateStyle__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2921:1: ( rule__PropertyDateStyle__Group__3__Impl )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2922:2: rule__PropertyDateStyle__Group__3__Impl
+            {
+            pushFollow(FOLLOW_rule__PropertyDateStyle__Group__3__Impl_in_rule__PropertyDateStyle__Group__35999);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2928:1: rule__PropertyDateStyle__Group__3__Impl : ( ( rule__PropertyDateStyle__DateFormatAssignment_3 ) ) ;
+    public final void rule__PropertyDateStyle__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2932:1: ( ( ( rule__PropertyDateStyle__DateFormatAssignment_3 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2933:1: ( ( rule__PropertyDateStyle__DateFormatAssignment_3 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2933:1: ( ( rule__PropertyDateStyle__DateFormatAssignment_3 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2934:1: ( rule__PropertyDateStyle__DateFormatAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyDateStyleAccess().getDateFormatAssignment_3()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2935:1: ( rule__PropertyDateStyle__DateFormatAssignment_3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2935:2: rule__PropertyDateStyle__DateFormatAssignment_3
+            {
+            pushFollow(FOLLOW_rule__PropertyDateStyle__DateFormatAssignment_3_in_rule__PropertyDateStyle__Group__3__Impl6026);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2953: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2957:1: ( rule__PropertyNumberStyle__Group__0__Impl rule__PropertyNumberStyle__Group__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2958:2: rule__PropertyNumberStyle__Group__0__Impl rule__PropertyNumberStyle__Group__1
+            {
+            pushFollow(FOLLOW_rule__PropertyNumberStyle__Group__0__Impl_in_rule__PropertyNumberStyle__Group__06064);
+            rule__PropertyNumberStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyNumberStyle__Group__1_in_rule__PropertyNumberStyle__Group__06067);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2965:1: rule__PropertyNumberStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyNumberStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2969:1: ( ( () ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2970:1: ( () )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2970:1: ( () )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2971:1: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyNumberStyleAccess().getCxGridPropNumberStyleAction_0()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2972:1: ()
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2974:1: 
+            {
+            }
+
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2984: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2988:1: ( rule__PropertyNumberStyle__Group__1__Impl rule__PropertyNumberStyle__Group__2 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2989:2: rule__PropertyNumberStyle__Group__1__Impl rule__PropertyNumberStyle__Group__2
+            {
+            pushFollow(FOLLOW_rule__PropertyNumberStyle__Group__1__Impl_in_rule__PropertyNumberStyle__Group__16125);
+            rule__PropertyNumberStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyNumberStyle__Group__2_in_rule__PropertyNumberStyle__Group__16128);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:2996:1: rule__PropertyNumberStyle__Group__1__Impl : ( 'numberStyle' ) ;
+    public final void rule__PropertyNumberStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3000:1: ( ( 'numberStyle' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3001:1: ( 'numberStyle' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3001:1: ( 'numberStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3002:1: 'numberStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyNumberStyleAccess().getNumberStyleKeyword_1()); 
+            }
+            match(input,41,FOLLOW_41_in_rule__PropertyNumberStyle__Group__1__Impl6156); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3015: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3019:1: ( rule__PropertyNumberStyle__Group__2__Impl rule__PropertyNumberStyle__Group__3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3020:2: rule__PropertyNumberStyle__Group__2__Impl rule__PropertyNumberStyle__Group__3
+            {
+            pushFollow(FOLLOW_rule__PropertyNumberStyle__Group__2__Impl_in_rule__PropertyNumberStyle__Group__26187);
+            rule__PropertyNumberStyle__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyNumberStyle__Group__3_in_rule__PropertyNumberStyle__Group__26190);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3027:1: rule__PropertyNumberStyle__Group__2__Impl : ( 'format' ) ;
+    public final void rule__PropertyNumberStyle__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3031:1: ( ( 'format' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3032:1: ( 'format' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3032:1: ( 'format' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3033:1: 'format'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyNumberStyleAccess().getFormatKeyword_2()); 
+            }
+            match(input,40,FOLLOW_40_in_rule__PropertyNumberStyle__Group__2__Impl6218); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3046:1: rule__PropertyNumberStyle__Group__3 : rule__PropertyNumberStyle__Group__3__Impl ;
+    public final void rule__PropertyNumberStyle__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3050:1: ( rule__PropertyNumberStyle__Group__3__Impl )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3051:2: rule__PropertyNumberStyle__Group__3__Impl
+            {
+            pushFollow(FOLLOW_rule__PropertyNumberStyle__Group__3__Impl_in_rule__PropertyNumberStyle__Group__36249);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3057:1: rule__PropertyNumberStyle__Group__3__Impl : ( ( rule__PropertyNumberStyle__NumberFormatAssignment_3 ) ) ;
+    public final void rule__PropertyNumberStyle__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3061:1: ( ( ( rule__PropertyNumberStyle__NumberFormatAssignment_3 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3062:1: ( ( rule__PropertyNumberStyle__NumberFormatAssignment_3 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3062:1: ( ( rule__PropertyNumberStyle__NumberFormatAssignment_3 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3063:1: ( rule__PropertyNumberStyle__NumberFormatAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatAssignment_3()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3064:1: ( rule__PropertyNumberStyle__NumberFormatAssignment_3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3064:2: rule__PropertyNumberStyle__NumberFormatAssignment_3
+            {
+            pushFollow(FOLLOW_rule__PropertyNumberStyle__NumberFormatAssignment_3_in_rule__PropertyNumberStyle__Group__3__Impl6276);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3082: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3086:1: ( rule__PropertyProgressbarStyle__Group__0__Impl rule__PropertyProgressbarStyle__Group__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3087:2: rule__PropertyProgressbarStyle__Group__0__Impl rule__PropertyProgressbarStyle__Group__1
+            {
+            pushFollow(FOLLOW_rule__PropertyProgressbarStyle__Group__0__Impl_in_rule__PropertyProgressbarStyle__Group__06314);
+            rule__PropertyProgressbarStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyProgressbarStyle__Group__1_in_rule__PropertyProgressbarStyle__Group__06317);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3094:1: rule__PropertyProgressbarStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyProgressbarStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3098:1: ( ( () ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3099:1: ( () )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3099:1: ( () )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3100:1: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyProgressbarStyleAccess().getCxGridPropProgressbarStyleAction_0()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3101:1: ()
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3103:1: 
+            {
+            }
+
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3113: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3117:1: ( rule__PropertyProgressbarStyle__Group__1__Impl rule__PropertyProgressbarStyle__Group__2 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3118:2: rule__PropertyProgressbarStyle__Group__1__Impl rule__PropertyProgressbarStyle__Group__2
+            {
+            pushFollow(FOLLOW_rule__PropertyProgressbarStyle__Group__1__Impl_in_rule__PropertyProgressbarStyle__Group__16375);
+            rule__PropertyProgressbarStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyProgressbarStyle__Group__2_in_rule__PropertyProgressbarStyle__Group__16378);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3125:1: rule__PropertyProgressbarStyle__Group__1__Impl : ( 'progressbarStyle' ) ;
+    public final void rule__PropertyProgressbarStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3129:1: ( ( 'progressbarStyle' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3130:1: ( 'progressbarStyle' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3130:1: ( 'progressbarStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3131:1: 'progressbarStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyProgressbarStyleAccess().getProgressbarStyleKeyword_1()); 
+            }
+            match(input,42,FOLLOW_42_in_rule__PropertyProgressbarStyle__Group__1__Impl6406); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3144: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3148:1: ( rule__PropertyProgressbarStyle__Group__2__Impl rule__PropertyProgressbarStyle__Group__3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3149:2: rule__PropertyProgressbarStyle__Group__2__Impl rule__PropertyProgressbarStyle__Group__3
+            {
+            pushFollow(FOLLOW_rule__PropertyProgressbarStyle__Group__2__Impl_in_rule__PropertyProgressbarStyle__Group__26437);
+            rule__PropertyProgressbarStyle__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyProgressbarStyle__Group__3_in_rule__PropertyProgressbarStyle__Group__26440);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3156:1: rule__PropertyProgressbarStyle__Group__2__Impl : ( 'max' ) ;
+    public final void rule__PropertyProgressbarStyle__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3160:1: ( ( 'max' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3161:1: ( 'max' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3161:1: ( 'max' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3162:1: 'max'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyProgressbarStyleAccess().getMaxKeyword_2()); 
+            }
+            match(input,43,FOLLOW_43_in_rule__PropertyProgressbarStyle__Group__2__Impl6468); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3175:1: rule__PropertyProgressbarStyle__Group__3 : rule__PropertyProgressbarStyle__Group__3__Impl ;
+    public final void rule__PropertyProgressbarStyle__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3179:1: ( rule__PropertyProgressbarStyle__Group__3__Impl )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3180:2: rule__PropertyProgressbarStyle__Group__3__Impl
+            {
+            pushFollow(FOLLOW_rule__PropertyProgressbarStyle__Group__3__Impl_in_rule__PropertyProgressbarStyle__Group__36499);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3186:1: rule__PropertyProgressbarStyle__Group__3__Impl : ( ( rule__PropertyProgressbarStyle__MaxValueAssignment_3 ) ) ;
+    public final void rule__PropertyProgressbarStyle__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3190:1: ( ( ( rule__PropertyProgressbarStyle__MaxValueAssignment_3 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3191:1: ( ( rule__PropertyProgressbarStyle__MaxValueAssignment_3 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3191:1: ( ( rule__PropertyProgressbarStyle__MaxValueAssignment_3 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3192:1: ( rule__PropertyProgressbarStyle__MaxValueAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueAssignment_3()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3193:1: ( rule__PropertyProgressbarStyle__MaxValueAssignment_3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3193:2: rule__PropertyProgressbarStyle__MaxValueAssignment_3
+            {
+            pushFollow(FOLLOW_rule__PropertyProgressbarStyle__MaxValueAssignment_3_in_rule__PropertyProgressbarStyle__Group__3__Impl6526);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3211: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3215:1: ( rule__GridPropIndicatorStyle__Group__0__Impl rule__GridPropIndicatorStyle__Group__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3216:2: rule__GridPropIndicatorStyle__Group__0__Impl rule__GridPropIndicatorStyle__Group__1
+            {
+            pushFollow(FOLLOW_rule__GridPropIndicatorStyle__Group__0__Impl_in_rule__GridPropIndicatorStyle__Group__06564);
+            rule__GridPropIndicatorStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__GridPropIndicatorStyle__Group__1_in_rule__GridPropIndicatorStyle__Group__06567);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3223:1: rule__GridPropIndicatorStyle__Group__0__Impl : ( () ) ;
+    public final void rule__GridPropIndicatorStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3227:1: ( ( () ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3228:1: ( () )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3228:1: ( () )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3229:1: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getCxGridPropIndicatorStyleAction_0()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3230:1: ()
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3232:1: 
+            {
+            }
+
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3242: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3246:1: ( rule__GridPropIndicatorStyle__Group__1__Impl rule__GridPropIndicatorStyle__Group__2 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3247:2: rule__GridPropIndicatorStyle__Group__1__Impl rule__GridPropIndicatorStyle__Group__2
+            {
+            pushFollow(FOLLOW_rule__GridPropIndicatorStyle__Group__1__Impl_in_rule__GridPropIndicatorStyle__Group__16625);
+            rule__GridPropIndicatorStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__GridPropIndicatorStyle__Group__2_in_rule__GridPropIndicatorStyle__Group__16628);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3254:1: rule__GridPropIndicatorStyle__Group__1__Impl : ( 'indicatorStyle' ) ;
+    public final void rule__GridPropIndicatorStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3258:1: ( ( 'indicatorStyle' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3259:1: ( 'indicatorStyle' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3259:1: ( 'indicatorStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3260:1: 'indicatorStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getIndicatorStyleKeyword_1()); 
+            }
+            match(input,44,FOLLOW_44_in_rule__GridPropIndicatorStyle__Group__1__Impl6656); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3273: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3277:1: ( rule__GridPropIndicatorStyle__Group__2__Impl rule__GridPropIndicatorStyle__Group__3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3278:2: rule__GridPropIndicatorStyle__Group__2__Impl rule__GridPropIndicatorStyle__Group__3
+            {
+            pushFollow(FOLLOW_rule__GridPropIndicatorStyle__Group__2__Impl_in_rule__GridPropIndicatorStyle__Group__26687);
+            rule__GridPropIndicatorStyle__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__GridPropIndicatorStyle__Group__3_in_rule__GridPropIndicatorStyle__Group__26690);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3285:1: rule__GridPropIndicatorStyle__Group__2__Impl : ( 'greenFrom' ) ;
+    public final void rule__GridPropIndicatorStyle__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3289:1: ( ( 'greenFrom' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3290:1: ( 'greenFrom' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3290:1: ( 'greenFrom' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3291:1: 'greenFrom'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getGreenFromKeyword_2()); 
+            }
+            match(input,45,FOLLOW_45_in_rule__GridPropIndicatorStyle__Group__2__Impl6718); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3304: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3308:1: ( rule__GridPropIndicatorStyle__Group__3__Impl rule__GridPropIndicatorStyle__Group__4 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3309:2: rule__GridPropIndicatorStyle__Group__3__Impl rule__GridPropIndicatorStyle__Group__4
+            {
+            pushFollow(FOLLOW_rule__GridPropIndicatorStyle__Group__3__Impl_in_rule__GridPropIndicatorStyle__Group__36749);
+            rule__GridPropIndicatorStyle__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__GridPropIndicatorStyle__Group__4_in_rule__GridPropIndicatorStyle__Group__36752);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3316:1: rule__GridPropIndicatorStyle__Group__3__Impl : ( ( rule__GridPropIndicatorStyle__GreenStartsAssignment_3 ) ) ;
+    public final void rule__GridPropIndicatorStyle__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3320:1: ( ( ( rule__GridPropIndicatorStyle__GreenStartsAssignment_3 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3321:1: ( ( rule__GridPropIndicatorStyle__GreenStartsAssignment_3 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3321:1: ( ( rule__GridPropIndicatorStyle__GreenStartsAssignment_3 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3322:1: ( rule__GridPropIndicatorStyle__GreenStartsAssignment_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsAssignment_3()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3323:1: ( rule__GridPropIndicatorStyle__GreenStartsAssignment_3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3323:2: rule__GridPropIndicatorStyle__GreenStartsAssignment_3
+            {
+            pushFollow(FOLLOW_rule__GridPropIndicatorStyle__GreenStartsAssignment_3_in_rule__GridPropIndicatorStyle__Group__3__Impl6779);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3333: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3337:1: ( rule__GridPropIndicatorStyle__Group__4__Impl rule__GridPropIndicatorStyle__Group__5 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3338:2: rule__GridPropIndicatorStyle__Group__4__Impl rule__GridPropIndicatorStyle__Group__5
+            {
+            pushFollow(FOLLOW_rule__GridPropIndicatorStyle__Group__4__Impl_in_rule__GridPropIndicatorStyle__Group__46809);
+            rule__GridPropIndicatorStyle__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__GridPropIndicatorStyle__Group__5_in_rule__GridPropIndicatorStyle__Group__46812);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3345:1: rule__GridPropIndicatorStyle__Group__4__Impl : ( 'redUntil' ) ;
+    public final void rule__GridPropIndicatorStyle__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3349:1: ( ( 'redUntil' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3350:1: ( 'redUntil' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3350:1: ( 'redUntil' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3351:1: 'redUntil'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getRedUntilKeyword_4()); 
+            }
+            match(input,46,FOLLOW_46_in_rule__GridPropIndicatorStyle__Group__4__Impl6840); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3364:1: rule__GridPropIndicatorStyle__Group__5 : rule__GridPropIndicatorStyle__Group__5__Impl ;
+    public final void rule__GridPropIndicatorStyle__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3368:1: ( rule__GridPropIndicatorStyle__Group__5__Impl )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3369:2: rule__GridPropIndicatorStyle__Group__5__Impl
+            {
+            pushFollow(FOLLOW_rule__GridPropIndicatorStyle__Group__5__Impl_in_rule__GridPropIndicatorStyle__Group__56871);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3375:1: rule__GridPropIndicatorStyle__Group__5__Impl : ( ( rule__GridPropIndicatorStyle__RedEndsAssignment_5 ) ) ;
+    public final void rule__GridPropIndicatorStyle__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3379:1: ( ( ( rule__GridPropIndicatorStyle__RedEndsAssignment_5 ) ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3380:1: ( ( rule__GridPropIndicatorStyle__RedEndsAssignment_5 ) )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3380:1: ( ( rule__GridPropIndicatorStyle__RedEndsAssignment_5 ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3381:1: ( rule__GridPropIndicatorStyle__RedEndsAssignment_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsAssignment_5()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3382:1: ( rule__GridPropIndicatorStyle__RedEndsAssignment_5 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3382:2: rule__GridPropIndicatorStyle__RedEndsAssignment_5
+            {
+            pushFollow(FOLLOW_rule__GridPropIndicatorStyle__RedEndsAssignment_5_in_rule__GridPropIndicatorStyle__Group__5__Impl6898);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3404: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3408:1: ( rule__PropertyQuantityStyle__Group__0__Impl rule__PropertyQuantityStyle__Group__1 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3409:2: rule__PropertyQuantityStyle__Group__0__Impl rule__PropertyQuantityStyle__Group__1
+            {
+            pushFollow(FOLLOW_rule__PropertyQuantityStyle__Group__0__Impl_in_rule__PropertyQuantityStyle__Group__06940);
+            rule__PropertyQuantityStyle__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyQuantityStyle__Group__1_in_rule__PropertyQuantityStyle__Group__06943);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3416:1: rule__PropertyQuantityStyle__Group__0__Impl : ( () ) ;
+    public final void rule__PropertyQuantityStyle__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3420:1: ( ( () ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3421:1: ( () )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3421:1: ( () )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3422:1: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getCxGridPropQuantityStyleAction_0()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3423:1: ()
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3425:1: 
+            {
+            }
+
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3435: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3439:1: ( rule__PropertyQuantityStyle__Group__1__Impl rule__PropertyQuantityStyle__Group__2 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3440:2: rule__PropertyQuantityStyle__Group__1__Impl rule__PropertyQuantityStyle__Group__2
+            {
+            pushFollow(FOLLOW_rule__PropertyQuantityStyle__Group__1__Impl_in_rule__PropertyQuantityStyle__Group__17001);
+            rule__PropertyQuantityStyle__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyQuantityStyle__Group__2_in_rule__PropertyQuantityStyle__Group__17004);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3447:1: rule__PropertyQuantityStyle__Group__1__Impl : ( 'quantityStyle' ) ;
+    public final void rule__PropertyQuantityStyle__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3451:1: ( ( 'quantityStyle' ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3452:1: ( 'quantityStyle' )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3452:1: ( 'quantityStyle' )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3453:1: 'quantityStyle'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getQuantityStyleKeyword_1()); 
+            }
+            match(input,47,FOLLOW_47_in_rule__PropertyQuantityStyle__Group__1__Impl7032); 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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3466: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3470:1: ( rule__PropertyQuantityStyle__Group__2__Impl rule__PropertyQuantityStyle__Group__3 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3471:2: rule__PropertyQuantityStyle__Group__2__Impl rule__PropertyQuantityStyle__Group__3
+            {
+            pushFollow(FOLLOW_rule__PropertyQuantityStyle__Group__2__Impl_in_rule__PropertyQuantityStyle__Group__27063);
+            rule__PropertyQuantityStyle__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_rule__PropertyQuantityStyle__Group__3_in_rule__PropertyQuantityStyle__Group__27066);
+            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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3478:1: rule__PropertyQuantityStyle__Group__2__Impl : ( ( rule__PropertyQuantityStyle__HtmlPatternAssignment_2 )? ) ;
+    public final void rule__PropertyQuantityStyle__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+            
+        try {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3482:1: ( ( ( rule__PropertyQuantityStyle__HtmlPatternAssignment_2 )? ) )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3483:1: ( ( rule__PropertyQuantityStyle__HtmlPatternAssignment_2 )? )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3483:1: ( ( rule__PropertyQuantityStyle__HtmlPatternAssignment_2 )? )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3484:1: ( rule__PropertyQuantityStyle__HtmlPatternAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternAssignment_2()); 
+            }
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3485:1: ( rule__PropertyQuantityStyle__HtmlPatternAssignment_2 )?
+            int alt16=2;
+            int LA16_0 = input.LA(1);
+
+            if ( (LA16_0==RULE_STRING) ) {
+                alt16=1;
+            }
+            switch (alt16) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3485:2: rule__PropertyQuantityStyle__HtmlPatternAssignment_2
+                    {
+                    pushFollow(FOLLOW_rule__PropertyQuantityStyle__HtmlPatternAssignment_2_in_rule__PropertyQuantityStyle__Group__2__Impl7093);
+                    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"
+    // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3495: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 {
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3499:1: ( rule__PropertyQuantityStyle__Group__3__Impl rule__PropertyQuantityStyle__Group__4 )
+            // ../org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/contentassist/antlr/internal/InternalGridSource.g:3500:2: rule__PropertyQuantityStyle__Group__3__Impl rule__PropertyQuantityStyle__Group__4
+            {
+            pushFollow(FOLLOW_rule__PropertyQuantityStyle__Group__3__Impl_in_rule__PropertyQuantityStyle__Group__37124);
+            rule__PropertyQuantityStyle__Group__3__Impl();
+
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
new file mode 100644
index 0000000..f0910e0
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src-gen/org/eclipse/osbp/xtext/gridsource/ui/internal/GridSourceActivator.java
@@ -0,0 +1,105 @@
+/**
+ *                                                                            
+ *  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.internal;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.log4j.Logger;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.ui.shared.SharedStateModule;
+import org.eclipse.xtext.util.Modules2;
+import org.osgi.framework.BundleContext;
+
+import com.google.common.collect.Maps;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+
+/**
+ * This class was generated. Customizations should only happen in a newly
+ * introduced subclass. 
+ */
+public class 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 GridSourceActivator INSTANCE;
+	
+	private Map<String, Injector> injectors = Collections.synchronizedMap(Maps.<String, Injector> newHashMapWithExpectedSize(1));
+	
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		INSTANCE = this;
+	}
+	
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		injectors.clear();
+		INSTANCE = null;
+		super.stop(context);
+	}
+	
+	public static GridSourceActivator getInstance() {
+		return INSTANCE;
+	}
+	
+	public Injector getInjector(String language) {
+		synchronized (injectors) {
+			Injector injector = injectors.get(language);
+			if (injector == null) {
+				injectors.put(language, injector = createInjector(language));
+			}
+			return injector;
+		}
+	}
+	
+	protected Injector createInjector(String language) {
+		try {
+			Module runtimeModule = getRuntimeModule(language);
+			Module sharedStateModule = getSharedStateModule();
+			Module uiModule = getUiModule(language);
+			Module mergedModule = Modules2.mixin(runtimeModule, sharedStateModule, uiModule);
+			return Guice.createInjector(mergedModule);
+		} catch (Exception e) {
+			logger.error("Failed to create injector for " + language);
+			logger.error(e.getMessage(), e);
+			throw new RuntimeException("Failed to create injector for " + language, e);
+		}
+	}
+
+	protected Module getRuntimeModule(String grammar) {
+		if (ORG_ECLIPSE_OSBP_XTEXT_GRIDSOURCE_GRIDSOURCE.equals(grammar)) {
+			return new org.eclipse.osbp.xtext.gridsource.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);
+		}
+		
+		throw new IllegalArgumentException(grammar);
+	}
+	
+	protected Module getSharedStateModule() {
+		return new SharedStateModule();
+	}
+	
+}
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
new file mode 100644
index 0000000..96ce48b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceDocumentationTranslator.java
@@ -0,0 +1,32 @@
+/**
+ *                                                                            
+ * 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;
+
+import java.util.ResourceBundle;
+
+import org.eclipse.osbp.utils.constants.GeneratorConstants;
+import org.eclipse.osbp.xtext.basic.ui.BasicDSLDocumentationTranslator;
+
+public class GridSourceDocumentationTranslator extends BasicDSLDocumentationTranslator {
+	 
+    private static GridSourceDocumentationTranslator INSTANCE = new GridSourceDocumentationTranslator();
+
+    public static BasicDSLDocumentationTranslator instance() {
+        return INSTANCE;
+    }
+    
+    @Override
+    protected ResourceBundle getResourceBundle() {
+        return java.util.ResourceBundle.getBundle(GeneratorConstants.I18N_RESOURCE_FULL_BUNDLE_NAME, getLocale(), getClass().getClassLoader());
+    }
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceEObjectHover.java b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceEObjectHover.java
new file mode 100644
index 0000000..3be902c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceEObjectHover.java
@@ -0,0 +1,25 @@
+/**
+ *                                                                            
+ * 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;
+
+import org.eclipse.xtext.ui.editor.hover.IEObjectHoverProvider;
+
+import org.eclipse.osbp.xtext.basic.ui.BasicDSLEObjectHover;
+
+public class GridSourceEObjectHover extends BasicDSLEObjectHover {
+	
+	@Override
+	public IEObjectHoverProvider getHoverProvider() {
+		return GridSourceEObjectHoverProvider.instance();
+	}
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceEObjectHoverDocumentationProvider.java b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceEObjectHoverDocumentationProvider.java
new file mode 100644
index 0000000..66843da
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceEObjectHoverDocumentationProvider.java
@@ -0,0 +1,35 @@
+/**
+ *                                                                            
+ * 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;
+
+import org.eclipse.osbp.xtext.basic.ui.BasicDSLDocumentationTranslator;
+import org.eclipse.osbp.xtext.basic.ui.BasicDSLEObjectHoverDocumentationProvider;
+
+public class GridSourceEObjectHoverDocumentationProvider extends BasicDSLEObjectHoverDocumentationProvider {
+	 
+    private static GridSourceEObjectHoverDocumentationProvider INSTANCE;
+
+    public static GridSourceEObjectHoverDocumentationProvider instance() {
+        return INSTANCE;
+    }
+
+    public GridSourceEObjectHoverDocumentationProvider() {
+        super();
+        INSTANCE = this;
+    }
+    
+    @Override
+    protected BasicDSLDocumentationTranslator getTranslator() {
+        return GridSourceDocumentationTranslator.instance();
+    }
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceEObjectHoverProvider.java b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceEObjectHoverProvider.java
new file mode 100644
index 0000000..bd49b89
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceEObjectHoverProvider.java
@@ -0,0 +1,36 @@
+/**
+ *                                                                            
+ * 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;
+
+import org.eclipse.xtext.ui.editor.hover.html.IEObjectHoverDocumentationProvider;
+
+import org.eclipse.osbp.xtext.basic.ui.BasicDSLEObjectHoverProvider;
+
+public class GridSourceEObjectHoverProvider extends BasicDSLEObjectHoverProvider {
+	 
+    private static GridSourceEObjectHoverProvider INSTANCE;
+
+    public static GridSourceEObjectHoverProvider instance() {
+        return INSTANCE;
+    }
+
+    public GridSourceEObjectHoverProvider() {
+        super();
+        INSTANCE = this;
+    }
+    
+    @Override
+    public IEObjectHoverDocumentationProvider getDocumentationHoverProvider() {
+        return GridSourceEObjectHoverDocumentationProvider.instance();
+    }
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceUiModule.java b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceUiModule.java
new file mode 100644
index 0000000..59f7f4e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/GridSourceUiModule.java
@@ -0,0 +1,42 @@
+/**
+ *                                                                            
+ *  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;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.xtext.ui.editor.hover.IEObjectHover;
+import org.eclipse.xtext.ui.editor.hover.IEObjectHoverProvider;
+import org.eclipse.xtext.ui.editor.hover.html.IEObjectHoverDocumentationProvider;
+
+/**
+ * Use this class to register components to be used within the IDE.
+ */
+public class GridSourceUiModule extends
+		org.eclipse.osbp.xtext.gridsource.ui.AbstractGridSourceUiModule {
+	public GridSourceUiModule(AbstractUIPlugin plugin) {
+		super(plugin);
+	}
+
+	@Override
+	public Class<? extends IEObjectHover> bindIEObjectHover() {
+		return GridSourceEObjectHover.class;
+	}
+
+	public Class<? extends IEObjectHoverProvider> bindIEObjectHoverProvider() {
+		return GridSourceEObjectHoverProvider.class;
+	}
+
+	public Class<? extends IEObjectHoverDocumentationProvider> bindIEObjectHoverDocumentationProvider() {
+		return GridSourceEObjectHoverDocumentationProvider.class;
+	}
+}
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
new file mode 100644
index 0000000..0dc5bdd
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/contentassist/GridSourceProposalProvider.xtend
@@ -0,0 +1,329 @@
+/**
+ *                                                                            
+ *  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
+ * 
+ * 
+ *  This copyright notice shows up in the generated Java code
+ *
+ */
+ 
+package org.eclipse.osbp.xtext.gridsource.ui.contentassist
+
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.jface.viewers.StyledString
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropButtonStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropImageStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridStyleConfigNumericToResource
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridStyleConfigStringToResource
+import org.eclipse.osbp.xtext.basic.ui.contentassist.BasicDSLProposalProviderHelper
+import org.eclipse.osbp.xtext.gridsource.ui.GridSourceDocumentationTranslator
+import org.eclipse.xtext.Assignment
+import org.eclipse.xtext.Keyword
+import org.eclipse.xtext.ui.editor.contentassist.ContentAssistContext
+import org.eclipse.xtext.ui.editor.contentassist.ICompletionProposalAcceptor
+
+class GridSourceProposalProvider extends AbstractGridSourceProposalProvider {
+
+	static String DEMO_TOPIC = "\"org/my/topic/*\""
+	static String DEMO_RESOURCE = "theme:/common/etc/my.png"
+	static String DEMO_NUMERIC_VALUE = "123.45"
+	static String DEMO_STRING_VALUE = "aBcDeF"
+
+	override StyledString getKeywordDisplayString(Keyword keyword) {
+		val keyString = keyword.value
+		if (keyString.equals("=") || keyString.equals("(") || keyString.equals(")")) {
+			return new StyledString(keyString)
+		}
+
+		return BasicDSLProposalProviderHelper.getKeywordDisplayString(keyword,
+			GridSourceDocumentationTranslator.instance())
+	}
+
+	override void completePropertyButtonStyle_EventTopic(EObject model, Assignment assignment,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completePropertyButtonStyle_EventTopic(model, assignment, context, acceptor)
+
+		doCompletePropertyButtonStyle_EventTopic(acceptor, model, context);
+	}
+
+	def doCompletePropertyButtonStyle_EventTopic(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(
+			doCreateProposal(DEMO_TOPIC, createStyledString(model as CxGridPropButtonStyle), model.image, 1000, context))
+	}
+
+	override void completePropertyImageStyle_EventTopic(EObject model, Assignment assignment,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completePropertyImageStyle_EventTopic(model, assignment, context, acceptor)
+
+		doCompletePropertyImageStyle_EventTopic(acceptor, model, context);
+	}
+
+	def doCompletePropertyImageStyle_EventTopic(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(
+			doCreateProposal(DEMO_TOPIC, createStyledString(model as CxGridPropImageStyle), model.image, 1000, context))
+	}
+
+	override void completeStringToResourceStyleConfig_Value(EObject model, Assignment assignment,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completeStringToResourceStyleConfig_Value(model, assignment, context, acceptor);
+
+		doCompleteStringToResourceStyleConfig_Value(acceptor, model, context);
+	}
+
+	def doCompleteStringToResourceStyleConfig_Value(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(
+			doCreateProposal("\"" + DEMO_STRING_VALUE + "\"",
+				createStyledString_Value(model as CxGridStyleConfigStringToResource), model.image, 1000, context))
+	}
+
+	override void completeStringToResourceStyleConfig_ResourceThemePath(EObject model, Assignment assignment,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completeStringToResourceStyleConfig_ResourceThemePath(model, assignment, context, acceptor);
+
+		doCompleteStringToResourceStyleConfig_ResourceThemePath(acceptor, model, context);
+	}
+
+	def doCompleteStringToResourceStyleConfig_ResourceThemePath(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(
+			doCreateProposal(DEMO_RESOURCE, createStyledString_Resource(model as CxGridStyleConfigStringToResource),
+				model.image, 1000, context))
+	}
+
+	override void completeNumericToResourceStyleConfig_ResourceThemePath(EObject model, Assignment assignment,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completeStringToResourceStyleConfig_ResourceThemePath(model, assignment, context, acceptor);
+
+		doCompleteNumericToResourceStyleConfig_ResourceThemePath(acceptor, model, context);
+	}
+
+	def doCompleteNumericToResourceStyleConfig_ResourceThemePath(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(
+			doCreateProposal(DEMO_RESOURCE, createStyledString_Resource(model as CxGridStyleConfigNumericToResource),
+				model.image, 1000, context))
+	}
+
+	override void completeNumericToResourceStyleConfig_Value(EObject model, Assignment assignment,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completeNumericToResourceStyleConfig_Value(model, assignment, context, acceptor);
+
+		doCompleteNumericToResourceStyleConfig_Value(acceptor, model, context);
+	}
+
+	def doCompleteNumericToResourceStyleConfig_Value(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(
+			doCreateProposal("123.45", createStyledString_Value(model as CxGridStyleConfigNumericToResource),
+				model.image, 1000, context))
+	}
+
+	override void completeGridPropIndicatorStyle_RedEnds(EObject model, Assignment assignment,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completePropertyDateStyle_DateFormat(model, assignment, context, acceptor);
+
+		doCompleteGridPropIndicatorStyle_RedEnds(acceptor, model, context);
+	}
+
+	def doCompleteGridPropIndicatorStyle_RedEnds(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(doCreateProposal(" 40 ", createStyledString_RedUntil(), model.image, 1000, context))
+	}
+
+	override void completeGridPropIndicatorStyle_GreenStarts(EObject model, Assignment assignment,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completePropertyDateStyle_DateFormat(model, assignment, context, acceptor);
+
+		dompleteGridPropIndicatorStyle_GreenStarts(acceptor, model, context);
+	}
+
+	def dompleteGridPropIndicatorStyle_GreenStarts(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(doCreateProposal(" 70 ", createStyledString_GreenFrom(), model.image, 1000, context))
+	}
+
+	override void completePropertyNumberStyle_NumberFormat(EObject model, Assignment assignment,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completePropertyDateStyle_DateFormat(model, assignment, context, acceptor);
+
+		doCompletePropertyNumberStyle_NumberFormat(acceptor, model, context);
+	}
+
+	def doCompletePropertyNumberStyle_NumberFormat(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(
+			doCreateProposal("'#,##0.00'", createStyledString_NumberFormat(), model.image, 1000, context))
+	}
+
+	override void completePropertyDateStyle_DateFormat(EObject model, Assignment assignment,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completePropertyDateStyle_DateFormat(model, assignment, context, acceptor);
+
+		doCompletePropertyDateStyle_DateFormat(acceptor, model, context);
+	}
+
+	def doCompletePropertyDateStyle_DateFormat(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(
+			doCreateProposal("'yyyy.MM.dd HH:mm:ss'", createStyledString_DateFormat(), model.image, 1000, context))
+	}
+
+	override void completePropertyProgressbarStyle_MaxValue(EObject model, Assignment assignment,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completePropertyProgressbarStyle_MaxValue(model, assignment, context, acceptor);
+
+		doCompletePropertyProgressbarStyle_MaxValue(acceptor, model, context);
+	}
+
+	def doCompletePropertyProgressbarStyle_MaxValue(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(
+			doCreateProposal(DEMO_NUMERIC_VALUE, createStyledString_MaxNumber(), model.image, 1000, context))
+	}
+
+	override completePropertyPriceStyle_HtmlPattern(EObject model, Assignment assignment, ContentAssistContext context,
+		ICompletionProposalAcceptor acceptor) {
+		super.completePropertyPriceStyle_HtmlPattern(model, assignment, context, acceptor);
+
+		doCompletePropertyPriceStyle_HtmlPattern(acceptor, model, context);
+	}
+
+	def doCompletePropertyPriceStyle_HtmlPattern(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(
+			doCreateProposal("\"<b>{@value}</b> <i>{@currency}</i>\"", createStyledString_CurrencyHtmlPattern(),
+				model.image, 1000, context))
+	}
+
+	override void completePropertyPriceStyle_ValueNumberFormat(EObject model, Assignment assignment,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completePropertyPriceStyle_ValueNumberFormat(model, assignment, context, acceptor);
+
+		doCompletePropertyPriceStyle_ValueNumberFormat(acceptor, model, context);
+	}
+
+	def doCompletePropertyPriceStyle_ValueNumberFormat(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(
+			doCreateProposal("'#,##0.00'", createStyledString_NumberFormat(), model.image, 1000, context))
+	}
+
+	override completePropertyQuantityStyle_HtmlPattern(EObject model, Assignment assignment,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completePropertyQuantityStyle_HtmlPattern(model, assignment, context, acceptor);
+
+		doCompletePropertyQuantityStyle_HtmlPattern(acceptor, model, context);
+	}
+
+	def doCompletePropertyQuantityStyle_HtmlPattern(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(
+			doCreateProposal("\"<b>{@value}</b> <i>{@uom}</i>\"", createStyledString_QuantityHtmlPattern(), model.image,
+				1000, context))
+	}
+
+	override void completePropertyQuantityStyle_ValueNumberFormat(EObject model, Assignment assignment,
+		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		super.completePropertyQuantityStyle_ValueNumberFormat(model, assignment, context, acceptor);
+
+		doCompletePropertyQuantityStyle_ValueNumberFormat(acceptor, model, context);
+	}
+
+	def doCompletePropertyQuantityStyle_ValueNumberFormat(ICompletionProposalAcceptor acceptor, EObject model,
+		ContentAssistContext context) {
+		acceptor.accept(
+			doCreateProposal("'#,##0.00'", createStyledString_NumberFormat(), model.image, 1000, context))
+	}
+
+	def dispatch createStyledString(CxGridPropButtonStyle object) {
+		val result = new StyledString("Specify a topic like ");
+		result.append(DEMO_TOPIC, StyledString.QUALIFIER_STYLER);
+		return result
+	}
+
+	def dispatch createStyledString(CxGridPropImageStyle object) {
+		val result = new StyledString("Specify a topic like ");
+		result.append(DEMO_TOPIC, StyledString.QUALIFIER_STYLER);
+		return result
+	}
+
+	def dispatch createStyledString_Resource(CxGridStyleConfigStringToResource object) {
+		val result = new StyledString("Specify an image like ");
+		result.append(DEMO_RESOURCE, StyledString.QUALIFIER_STYLER);
+		return result
+	}
+
+	def dispatch createStyledString_Resource(CxGridStyleConfigNumericToResource object) {
+		val result = new StyledString("Specify an image like ");
+		result.append(DEMO_RESOURCE, StyledString.QUALIFIER_STYLER);
+		return result
+	}
+
+	def dispatch createStyledString_Value(CxGridStyleConfigStringToResource object) {
+		val result = new StyledString("Specify any String to compare against. Like ");
+		result.append(DEMO_STRING_VALUE, StyledString.QUALIFIER_STYLER);
+		return result
+	}
+
+	def dispatch createStyledString_Value(CxGridStyleConfigNumericToResource object) {
+		val result = new StyledString("Specify any number to compare against. Like ");
+		result.append(DEMO_NUMERIC_VALUE, StyledString.QUALIFIER_STYLER);
+		return result
+	}
+
+	def StyledString createStyledString_DateFormat() {
+		val result = new StyledString("Specify any date format to be used. Like ");
+		result.append("'yyyy.MM.dd G 'at' HH:mm:ss z'", StyledString.QUALIFIER_STYLER);
+		return result
+	}
+
+	def StyledString createStyledString_CurrencyHtmlPattern() {
+		val result = new StyledString("Specify a HTML pattern including two placeholders. Like ");
+		result.append("<b>{@value}</b> <i>{@currency}</i>", StyledString.QUALIFIER_STYLER);
+		return result
+	}
+
+	def StyledString createStyledString_QuantityHtmlPattern() {
+		val result = new StyledString("Specify a HTML pattern including two placeholders. Like ");
+		result.append("<b>{@value}</b> <i>{@uom}</i>", StyledString.QUALIFIER_STYLER);
+		return result
+	}
+
+	def StyledString createStyledString_NumberFormat() {
+		val result = new StyledString("Specify any number format to be used. Like ");
+		result.append("'#,##0.00'", StyledString.QUALIFIER_STYLER);
+		return result
+	}
+
+	def StyledString createStyledString_MaxNumber() {
+		val result = new StyledString("Specify any number as the max value. Like ");
+		result.append(DEMO_NUMERIC_VALUE, StyledString.QUALIFIER_STYLER);
+		return result
+	}
+
+	def StyledString createStyledString_RedUntil() {
+		val result = new StyledString(
+			"Specify any integer as the threshold value. Values below will be displayed red. Example: ");
+		result.append("40", StyledString.QUALIFIER_STYLER);
+		return result
+	}
+
+	def StyledString createStyledString_GreenFrom() {
+		val result = new StyledString(
+			"Specify any integer as the threshold value. Values above will be displayed green. Example: ");
+		result.append("70", StyledString.QUALIFIER_STYLER);
+		return result
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/labeling/GridSourceDescriptionLabelProvider.xtend b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/labeling/GridSourceDescriptionLabelProvider.xtend
new file mode 100644
index 0000000..dbc3268
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/labeling/GridSourceDescriptionLabelProvider.xtend
@@ -0,0 +1,38 @@
+/**
+ *                                                                            
+ *  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
+ * 
+ * 
+ *  This copyright notice shows up in the generated Java code
+ *
+ */
+ 
+package org.eclipse.osbp.xtext.gridsource.ui.labeling
+
+//import org.eclipse.xtext.resource.IEObjectDescription
+
+/**
+ * Provides labels for a IEObjectDescriptions and IResourceDescriptions.
+ * 
+ * see http://www.eclipse.org/Xtext/documentation.html#labelProvider
+ */
+class GridSourceDescriptionLabelProvider extends org.eclipse.xtext.ui.label.DefaultDescriptionLabelProvider {
+
+	// Labels and icons can be computed like this:
+	
+//	override text(IEObjectDescription ele) {
+//		ele.name.toString
+//	}
+//	 
+//	override image(IEObjectDescription ele) {
+//		ele.EClass.name + '.gif'
+//	}	 
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/labeling/GridSourceLabelProvider.xtend b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/labeling/GridSourceLabelProvider.xtend
new file mode 100644
index 0000000..5781d5b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/labeling/GridSourceLabelProvider.xtend
@@ -0,0 +1,124 @@
+/**
+ *                                                                            
+ *  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
+ * 
+ * 
+ *  This copyright notice shows up in the generated Java code
+ *
+ */
+ 
+package org.eclipse.osbp.xtext.gridsource.ui.labeling
+
+import com.google.inject.Inject
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider
+import org.eclipse.jface.viewers.StyledString
+import org.eclipse.xtext.ui.label.DefaultEObjectLabelProvider
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridProperty
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridSource
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridSourceInput
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropBooleanStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropButtonStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropDateStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropHtmlStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropImageStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropIndicatorStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropNumberStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropPriceStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropProgressbarStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropQuantityStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropTextStyle
+import org.eclipse.osbp.infogrid.model.gridsource.util.Util
+
+/**
+ * Provides labels for a EObjects.
+ * 
+ * see http://www.eclipse.org/Xtext/documentation.html#labelProvider
+ */
+class GridSourceLabelProvider extends DefaultEObjectLabelProvider {
+
+	@Inject
+	new(AdapterFactoryLabelProvider delegate) {
+		super(delegate);
+	}
+
+	// Labels and icons can be computed like this:
+	def text(CxGridProperty ele) {
+		Util.calcDotPath(ele).text(ele.style)
+	}
+
+	def dispatch text(String prop, CxGridPropButtonStyle ele) {
+		prop.getDisplayString('''Button topic(«ele.eventTopic»)''')
+	}
+
+	def dispatch text(String prop, CxGridPropHtmlStyle ele) {
+		prop.getDisplayString("Html")
+	}
+
+	def dispatch text(String prop, CxGridPropBooleanStyle ele) {
+		prop.getDisplayString("Boolean")
+	}
+
+	def dispatch text(String prop, CxGridPropDateStyle ele) {
+		prop.getDisplayString('''Date format(«ele.dateFormat»)''')
+	}
+
+	def dispatch text(String prop, CxGridPropNumberStyle ele) {
+		prop.getDisplayString('''Number format(«ele.numberFormat»)''')
+	}
+
+	def dispatch text(String prop, CxGridPropProgressbarStyle ele) {
+		prop.getDisplayString('''ProgressBar max(«ele.maxValue»)''')
+	}
+
+	def dispatch text(String prop, CxGridPropIndicatorStyle ele) {
+		prop.getDisplayString('''Indicator red color < «ele.redEnds» green color > «ele.greenStarts»''')
+	} 
+
+	def dispatch text(String prop, CxGridPropQuantityStyle ele) {
+		prop.getDisplayString('''Quantity pattern(«ele.htmlPattern»)''')
+	}
+
+	def dispatch text(String prop, CxGridPropPriceStyle ele) {
+		prop.getDisplayString('''Price pattern(«ele.htmlPattern»)''')
+	}
+
+	def dispatch text(String prop, CxGridPropTextStyle ele) {
+		prop.getDisplayString("Text")
+	}
+
+	def dispatch text(String prop, CxGridPropImageStyle ele) {
+		prop.getDisplayString("Image")
+	}
+
+	def text(CxGridSourceInput ele) {
+		"Input".getDisplayString(ele.inputType.qualifiedName)
+	}
+
+	def StyledString getDisplayString(String value, String description) {
+		val StyledString string = new StyledString(value)
+		if (!description.nullOrEmpty)
+			string.append(" : " + description, StyledString.DECORATIONS_STYLER)
+
+		return string
+	}
+
+	def image(CxGridSource ele) {
+		'GridSource.png'
+	}
+
+	def image(CxGridSourceInput ele) {
+		'CxGridSourceInput.png'
+	}
+
+	def image(CxGridProperty ele) {
+		'CxGridProperty.png'
+	}
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/outline/GridSourceOutlineTreeProvider.xtend b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/outline/GridSourceOutlineTreeProvider.xtend
new file mode 100644
index 0000000..27762db
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/outline/GridSourceOutlineTreeProvider.xtend
@@ -0,0 +1,38 @@
+/**
+ *                                                                            
+ *  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
+ * 
+ * 
+ *  This copyright notice shows up in the generated Java code
+ *
+ */
+ 
+package org.eclipse.osbp.xtext.gridsource.ui.outline
+
+import org.eclipse.xtext.ui.editor.outline.impl.DefaultOutlineTreeProvider
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridProperty
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridSourceInput
+
+/**
+ * Customization of the default outline structure.
+ *
+ * see http://www.eclipse.org/Xtext/documentation.html#outline
+ */
+class GridSourceOutlineTreeProvider extends DefaultOutlineTreeProvider {
+
+	def boolean _isLeaf(CxGridProperty ele) {
+		return true;
+	}
+
+	def boolean _isLeaf(CxGridSourceInput ele) {
+		return true;
+	}
+}
diff --git a/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/quickfix/GridSourceQuickfixProvider.xtend b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/quickfix/GridSourceQuickfixProvider.xtend
new file mode 100644
index 0000000..6eeb05f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource.ui/src/org/eclipse/osbp/xtext/gridsource/ui/quickfix/GridSourceQuickfixProvider.xtend
@@ -0,0 +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
+ * 
+ * 
+ *  This copyright notice shows up in the generated Java code
+ *
+ */
+ 
+package org.eclipse.osbp.xtext.gridsource.ui.quickfix
+
+//import org.eclipse.xtext.ui.editor.quickfix.Fix
+//import org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor
+//import org.eclipse.xtext.validation.Issue
+
+/**
+ * Custom quickfixes.
+ *
+ * see http://www.eclipse.org/Xtext/documentation.html#quickfixes
+ */
+class GridSourceQuickfixProvider extends org.eclipse.xtext.xbase.ui.quickfix.XtypeQuickfixProvider {
+
+//	@Fix(MyDslValidator::INVALID_NAME)
+//	def capitalizeName(Issue issue, IssueResolutionAcceptor acceptor) {
+//		acceptor.accept(issue, 'Capitalize name', 'Capitalize the name.', 'upcase.png') [
+//			context |
+//			val xtextDocument = context.xtextDocument
+//			val firstLetter = xtextDocument.get(issue.offset, 1)
+//			xtextDocument.replace(issue.offset, 1, firstLetter.toUpperCase)
+//		]
+//	}
+}
diff --git "a/org.eclipse.osbp.xtext.gridsource/.launch/Generate Language Infrastructure \050org.eclipse.osbp.xtext.gridsource\051.launch" "b/org.eclipse.osbp.xtext.gridsource/.launch/Generate Language Infrastructure \050org.eclipse.osbp.xtext.gridsource\051.launch"
new file mode 100644
index 0000000..25b6bae
--- /dev/null
+++ "b/org.eclipse.osbp.xtext.gridsource/.launch/Generate Language Infrastructure \050org.eclipse.osbp.xtext.gridsource\051.launch"
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.emf.mwe2.launch.Mwe2LaunchConfigurationType">
+<stringAttribute key="org.eclipse.debug.core.ATTR_REFRESH_SCOPE" value="${working_set:&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;&#10;&lt;launchConfigurationWorkingSet factoryID=&quot;org.eclipse.ui.internal.WorkingSetFactory&quot; id=&quot;1299248699643_13&quot; label=&quot;working set&quot; name=&quot;working set&quot;&gt;&#10;&lt;item factoryID=&quot;org.eclipse.ui.internal.model.ResourceFactory&quot; path=&quot;/org.eclipse.osbp.xtext.gridsource&quot; type=&quot;4&quot;/&gt;&#10;&lt;item factoryID=&quot;org.eclipse.ui.internal.model.ResourceFactory&quot; path=&quot;/org.eclipse.osbp.xtext.gridsource.generator&quot; type=&quot;4&quot;/&gt;&#10;&lt;item factoryID=&quot;org.eclipse.ui.internal.model.ResourceFactory&quot; path=&quot;/org.eclipse.osbp.xtext.gridsource.tests&quot; type=&quot;4&quot;/&gt;&#10;&lt;item factoryID=&quot;org.eclipse.ui.internal.model.ResourceFactory&quot; path=&quot;/org.eclipse.osbp.xtext.gridsource.ui&quot; type=&quot;4&quot;/&gt;&#10;&lt;/launchConfigurationWorkingSet&gt;}"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.osbp.xtext.gridsource"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="4"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
+<listEntry value="org.eclipse.debug.ui.launchGroup.run"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.emf.mwe2.launch.runtime.Mwe2Launcher"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="src/org/osbee/xtext/GenerateGridSource.mwe2"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.osbp.xtext.gridsource"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx512m"/>
+</launchConfiguration>
diff --git a/org.eclipse.osbp.xtext.gridsource/.project b/org.eclipse.osbp.xtext.gridsource/.project
new file mode 100644
index 0000000..cb6709d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/.project
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.osbp.xtext.gridsource</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.osbp.ide.core.ui.softwarefactory.builder.OSBP2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.osbp.ide.core.ui.shared.OSBPModelEnhancingBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.osbp.ide.core.ui.shared.OSBPI18nBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<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.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>
+		<nature>org.eclipse.osbp.ide.core.ui.softwarefactory.OSBP2Nature</nature>
+		<nature>org.eclipse.osbp.ide.core.ui.shared.OSBPNature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.osbp.xtext.gridsource/LICENSE.txt b/org.eclipse.osbp.xtext.gridsource/LICENSE.txt
new file mode 100644
index 0000000..ff42ad4
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/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/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.gridsource/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b7015fb
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/META-INF/MANIFEST.MF
@@ -0,0 +1,34 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.osbp.xtext.gridsource
+Bundle-Vendor: Eclipse OSBP
+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,
+ org.eclipse.osbp.infogrid.model;bundle-version="[0.9.0,0.10.0)",
+ 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.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.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
+Import-Package: org.apache.log4j
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.osbp.xtext.gridsource;version="0.9.0",
+ org.eclipse.osbp.xtext.gridsource.services;version="0.9.0",
+ org.eclipse.osbp.xtext.gridsource.serializer;version="0.9.0",
+ org.eclipse.osbp.xtext.gridsource.parser.antlr;version="0.9.0",
+ org.eclipse.osbp.xtext.gridsource.parser.antlr.internal;version="0.9.0",
+ org.eclipse.osbp.xtext.gridsource.validation;version="0.9.0",
+ 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/about.html b/org.eclipse.osbp.xtext.gridsource/about.html
new file mode 100644
index 0000000..64c0598
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/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/about.ini b/org.eclipse.osbp.xtext.gridsource/about.ini
new file mode 100644
index 0000000..7df671f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/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/about.mappings b/org.eclipse.osbp.xtext.gridsource/about.mappings
new file mode 100644
index 0000000..4511a0a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/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/about.properties b/org.eclipse.osbp.xtext.gridsource/about.properties
new file mode 100644
index 0000000..8a5fbbc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/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
+
+################ 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/build.properties b/org.eclipse.osbp.xtext.gridsource/build.properties
new file mode 100644
index 0000000..6c9b269
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/build.properties
@@ -0,0 +1,12 @@
+source.. = src/,\
+          src-gen/,\
+          xtend-gen/
+bin.includes = about.properties,  about.mappings,  about.ini,  about.html,  META-INF/,\
+               .,\
+               license.html,\
+               LICENSE.txt,\
+               epl-v10.html
+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/epl-v10.html b/org.eclipse.osbp.xtext.gridsource/epl-v10.html
new file mode 100644
index 0000000..b398acc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/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/license.html b/org.eclipse.osbp.xtext.gridsource/license.html
new file mode 100644
index 0000000..6e579a5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/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/pom.xml b/org.eclipse.osbp.xtext.gridsource/pom.xml
new file mode 100644
index 0000000..2a26493
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/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</artifactId>
+    <build>
+        <sourceDirectory>src</sourceDirectory>
+        <plugins>
+        </plugins>
+    </build>
+    <packaging>eclipse-plugin</packaging>
+
+</project>
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
new file mode 100644
index 0000000..f8f0a77
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/AbstractGridSourceRuntimeModule.java
@@ -0,0 +1,182 @@
+/**
+ *                                                                            
+ *  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;
+
+import java.util.Properties;
+
+import org.eclipse.xtext.Constants;
+import org.eclipse.xtext.service.DefaultRuntimeModule;
+
+import com.google.inject.Binder;
+import com.google.inject.name.Names;
+
+/**
+ * Manual modifications go to {org.eclipse.osbp.xtext.gridsource.GridSourceRuntimeModule}
+ */
+ @SuppressWarnings("all")
+public abstract class AbstractGridSourceRuntimeModule extends DefaultRuntimeModule {
+
+	protected Properties properties = null;
+
+	@Override
+	public void configure(Binder binder) {
+		properties = tryBindProperties(binder, "org/eclipse/osbp/xtext/gridsource/GridSource.properties");
+		super.configure(binder);
+	}
+	
+	public void configureLanguageName(Binder binder) {
+		binder.bind(String.class).annotatedWith(Names.named(Constants.LANGUAGE_NAME)).toInstance("org.eclipse.osbp.xtext.gridsource.GridSource");
+	}
+	
+	public void configureFileExtensions(Binder binder) {
+		if (properties == null || properties.getProperty(Constants.FILE_EXTENSIONS) == null)
+			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() {
+		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.generator.types.TypesGeneratorFragment
+	public Class<? extends org.eclipse.xtext.common.types.access.IJvmTypeProvider.Factory> bindIJvmTypeProvider$Factory() {
+		return org.eclipse.xtext.common.types.access.ClasspathTypeProviderFactory.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
+	public Class<? extends org.eclipse.xtext.common.types.xtext.AbstractTypeScopeProvider> bindAbstractTypeScopeProvider() {
+		return org.eclipse.xtext.common.types.xtext.ClasspathBasedTypeScopeProvider.class;
+	}
+
+	// contributed by org.eclipse.xtext.generator.types.TypesGeneratorFragment
+	public Class<? extends org.eclipse.xtext.scoping.IGlobalScopeProvider> bindIGlobalScopeProvider() {
+		return org.eclipse.xtext.common.types.xtext.TypesAwareDefaultGlobalScopeProvider.class;
+	}
+
+}
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
new file mode 100644
index 0000000..3591afc
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/GridSourceStandaloneSetupGenerated.java
@@ -0,0 +1,51 @@
+/**
+ *                                                                            
+ *  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;
+
+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;
+
+/**
+ * Generated from StandaloneSetup.xpt!
+ */
+@SuppressWarnings("all")
+public class GridSourceStandaloneSetupGenerated implements ISetup {
+
+	public Injector createInjectorAndDoEMFRegistration() {
+		org.eclipse.xtext.xbase.XtypeStandaloneSetup.doSetup();
+
+		Injector injector = createInjector();
+		register(injector);
+		return injector;
+	}
+	
+	public Injector createInjector() {
+		return Guice.createInjector(new org.eclipse.osbp.xtext.gridsource.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);
+		
+
+
+	}
+}
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
new file mode 100644
index 0000000..caf2fb5
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/GridSourceAntlrTokenFileProvider.java
@@ -0,0 +1,25 @@
+/**
+ *                                                                            
+ *  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;
+
+import java.io.InputStream;
+import org.eclipse.xtext.parser.antlr.IAntlrTokenFileProvider;
+
+public class GridSourceAntlrTokenFileProvider implements IAntlrTokenFileProvider {
+	
+	public InputStream getAntlrTokenFile() {
+		ClassLoader classLoader = getClass().getClassLoader();
+    	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
new file mode 100644
index 0000000..ceb047e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/GridSourceParser.java
@@ -0,0 +1,49 @@
+/**
+ *                                                                            
+ *  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;
+
+import com.google.inject.Inject;
+
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.osbp.xtext.gridsource.services.GridSourceGrammarAccess;
+
+public class GridSourceParser extends org.eclipse.xtext.parser.antlr.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());
+	}
+	
+	@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
new file mode 100644
index 0000000..e54fe92
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g
@@ -0,0 +1,2713 @@
+/**
+ *                                                                            
+ *  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
+ * 
+ */
+grammar InternalGridSource;
+
+options {
+	superClass=AbstractInternalAntlrParser;
+	
+}
+
+@lexer::header {
+package org.eclipse.osbp.xtext.gridsource.parser.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.parser.antlr.Lexer;
+}
+
+@parser::header {
+package org.eclipse.osbp.xtext.gridsource.parser.antlr.internal; 
+
+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.emf.common.util.Enumerator;
+import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
+import org.eclipse.osbp.xtext.gridsource.services.GridSourceGrammarAccess;
+
+}
+
+@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";	
+   	}
+   	
+   	@Override
+   	protected GridSourceGrammarAccess getGrammarAccess() {
+   		return grammarAccess;
+   	}
+}
+
+@rulecatch { 
+    catch (RecognitionException re) { 
+        recover(input,re); 
+        appendSkippedTokens();
+    } 
+}
+
+
+
+
+// Entry rule entryRuleSource
+entryRuleSource returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getSourceRule()); }
+	 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());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleInput
+entryRuleInput returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getInputRule()); }
+	 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();
+	    }
+
+)
+))*)
+;
+
+
+
+
+
+// Entry rule entryRuleEQFilter
+entryRuleEQFilter returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getEQFilterRule()); }
+	 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();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleProperty
+entryRuleProperty returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getPropertyRule()); }
+	 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();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleNestedField
+entryRuleNestedField returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getNestedFieldRule()); }
+	 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();
+	    }
+
+)
+)?)
+;
+
+
+
+
+
+// Entry rule entryRuleNestedPath
+entryRuleNestedPath returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getNestedPathRule()); }
+	 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());
+    }
+(
+(
+		{
+			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();
+	    }
+
+)
+)?)
+;
+
+
+
+
+
+// Entry rule entryRulePropertyStyle
+entryRulePropertyStyle returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getPropertyStyleRule()); }
+	 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();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRulePropertyButtonStyle
+entryRulePropertyButtonStyle returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getPropertyButtonStyleRule()); }
+	 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
+		{
+			newLeafNode(lv_eventTopic_3_0, grammarAccess.getPropertyButtonStyleAccess().getEventTopicSTRINGTerminalRuleCall_3_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getPropertyButtonStyleRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"eventTopic",
+        		lv_eventTopic_3_0, 
+        		"STRING");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRulePropertyHtmlStyle
+entryRulePropertyHtmlStyle returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getPropertyHtmlStyleRule()); }
+	 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());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRulePropertyBooleanStyle
+entryRulePropertyBooleanStyle returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getPropertyBooleanStyleRule()); }
+	 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());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRulePropertyDateStyle
+entryRulePropertyDateStyle returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getPropertyDateStyleRule()); }
+	 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
+		{
+			newLeafNode(lv_dateFormat_3_0, grammarAccess.getPropertyDateStyleAccess().getDateFormatSTRINGTerminalRuleCall_3_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getPropertyDateStyleRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"dateFormat",
+        		lv_dateFormat_3_0, 
+        		"STRING");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRulePropertyNumberStyle
+entryRulePropertyNumberStyle returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getPropertyNumberStyleRule()); }
+	 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
+		{
+			newLeafNode(lv_numberFormat_3_0, grammarAccess.getPropertyNumberStyleAccess().getNumberFormatSTRINGTerminalRuleCall_3_0()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getPropertyNumberStyleRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"numberFormat",
+        		lv_numberFormat_3_0, 
+        		"STRING");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRulePropertyProgressbarStyle
+entryRulePropertyProgressbarStyle returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getPropertyProgressbarStyleRule()); }
+	 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();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleGridPropIndicatorStyle
+entryRuleGridPropIndicatorStyle returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getGridPropIndicatorStyleRule()); }
+	 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();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRulePropertyQuantityStyle
+entryRulePropertyQuantityStyle returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getPropertyQuantityStyleRule()); }
+	 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
+		{
+			newLeafNode(lv_htmlPattern_2_0, grammarAccess.getPropertyQuantityStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0()); 
+		}
+		{
+	        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()); 
+		}
+		{
+	        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();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRulePropertyPriceStyle
+entryRulePropertyPriceStyle returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getPropertyPriceStyleRule()); }
+	 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
+		{
+			newLeafNode(lv_htmlPattern_2_0, grammarAccess.getPropertyPriceStyleAccess().getHtmlPatternSTRINGTerminalRuleCall_2_0()); 
+		}
+		{
+	        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()); 
+		}
+		{
+	        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();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRulePropertyTextStyle
+entryRulePropertyTextStyle returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getPropertyTextStyleRule()); }
+	 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());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRulePropertyImageStyle
+entryRulePropertyImageStyle returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getPropertyImageStyleRule()); }
+	 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
+		{
+			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, 
+        		"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());
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleQualifiedName
+entryRuleQualifiedName returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getQualifiedNameRule()); } 
+	 iv_ruleQualifiedName=ruleQualifiedName 
+	 { $current=$iv_ruleQualifiedName.current.getText(); }  
+	 EOF 
+;
+
+// Rule QualifiedName
+ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); 
+    }
+    this_ValidID_0=ruleValidID    {
+		$current.merge(this_ValidID_0);
+    }
+
+    { 
+        afterParserOrEnumRuleCall();
+    }
+(((
+	'.' 
+)=>
+	kw='.' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); 
+    }
+)
+    { 
+        newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); 
+    }
+    this_ValidID_2=ruleValidID    {
+		$current.merge(this_ValidID_2);
+    }
+
+    { 
+        afterParserOrEnumRuleCall();
+    }
+)*)
+    ;
+
+
+
+
+
+// Entry rule entryRuleValidID
+entryRuleValidID returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getValidIDRule()); } 
+	 iv_ruleValidID=ruleValidID 
+	 { $current=$iv_ruleValidID.current.getText(); }  
+	 EOF 
+;
+
+// Rule ValidID
+ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+    this_ID_0=RULE_ID    {
+		$current.merge(this_ID_0);
+    }
+
+    { 
+    newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
+    }
+
+    ;
+
+
+
+
+
+// Entry rule entryRuleStyleConfig
+entryRuleStyleConfig returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStyleConfigRule()); }
+	 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();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleNumericToResourceStyleConfig
+entryRuleNumericToResourceStyleConfig returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getNumericToResourceStyleConfigRule()); }
+	 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
+		{
+			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, 
+        		"THEME_RESOURCE");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleStringToResourceStyleConfig
+entryRuleStringToResourceStyleConfig returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getStringToResourceStyleConfigRule()); }
+	 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
+		{
+			newLeafNode(lv_value_2_0, grammarAccess.getStringToResourceStyleConfigAccess().getValueSTRINGTerminalRuleCall_2_0()); 
+		}
+		{
+	        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()); 
+		}
+		{
+	        if ($current==null) {
+	            $current = createModelElement(grammarAccess.getStringToResourceStyleConfigRule());
+	        }
+       		setWithLastConsumed(
+       			$current, 
+       			"resourceThemePath",
+        		lv_resourceThemePath_4_0, 
+        		"THEME_RESOURCE");
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleLInt
+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()); 
+    }
+)
+    ;
+
+
+
+
+
+// Entry rule entryRuleLDouble
+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()); 
+    }
+)?)
+    ;
+
+
+
+
+
+// Entry rule entryRuleJvmTypeReference
+entryRuleJvmTypeReference returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getJvmTypeReferenceRule()); }
+	 iv_ruleJvmTypeReference=ruleJvmTypeReference 
+	 { $current=$iv_ruleJvmTypeReference.current; } 
+	 EOF 
+;
+
+// Rule JvmTypeReference
+ruleJvmTypeReference returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    { 
+        newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0()); 
+    }
+    this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference
+    { 
+        $current = $this_JvmParameterizedTypeReference_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+((((
+)	ruleArrayBrackets))=>((
+    {
+        $current = forceCreateModelElementAndSet(
+            grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0(),
+            $current);
+    }
+)
+    { 
+        newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1()); 
+    }
+ruleArrayBrackets
+    { 
+        afterParserOrEnumRuleCall();
+    }
+))*)
+    |
+    { 
+        newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); 
+    }
+    this_XFunctionTypeRef_3=ruleXFunctionTypeRef
+    { 
+        $current = $this_XFunctionTypeRef_3.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleArrayBrackets
+entryRuleArrayBrackets returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getArrayBracketsRule()); } 
+	 iv_ruleArrayBrackets=ruleArrayBrackets 
+	 { $current=$iv_ruleArrayBrackets.current.getText(); }  
+	 EOF 
+;
+
+// Rule ArrayBrackets
+ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+	kw='[' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0()); 
+    }
+
+	kw=']' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1()); 
+    }
+)
+    ;
+
+
+
+
+
+// Entry rule entryRuleXFunctionTypeRef
+entryRuleXFunctionTypeRef returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXFunctionTypeRefRule()); }
+	 iv_ruleXFunctionTypeRef=ruleXFunctionTypeRef 
+	 { $current=$iv_ruleXFunctionTypeRef.current; } 
+	 EOF 
+;
+
+// Rule XFunctionTypeRef
+ruleXFunctionTypeRef returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((	otherlv_0='(' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
+    }
+((
+(
+		{ 
+	        newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0()); 
+	    }
+		lv_paramTypes_1_0=ruleJvmTypeReference		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getXFunctionTypeRefRule());
+	        }
+       		add(
+       			$current, 
+       			"paramTypes",
+        		lv_paramTypes_1_0, 
+        		"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();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleJvmParameterizedTypeReference
+entryRuleJvmParameterizedTypeReference returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceRule()); }
+	 iv_ruleJvmParameterizedTypeReference=ruleJvmParameterizedTypeReference 
+	 { $current=$iv_ruleJvmParameterizedTypeReference.current; } 
+	 EOF 
+;
+
+// Rule JvmParameterizedTypeReference
+ruleJvmParameterizedTypeReference returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+(
+		{
+			if ($current==null) {
+	            $current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
+	        }
+        }
+		{ 
+	        newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0()); 
+	    }
+		ruleQualifiedName		{ 
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+)(((	'<' 
+)=>	otherlv_1='<' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
+    }
+)(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); 
+	    }
+		lv_arguments_2_0=ruleJvmArgumentTypeReference		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
+	        }
+       		add(
+       			$current, 
+       			"arguments",
+        		lv_arguments_2_0, 
+        		"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());
+    }
+)?)*)?)
+;
+
+
+
+
+
+// Entry rule entryRuleJvmArgumentTypeReference
+entryRuleJvmArgumentTypeReference returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceRule()); }
+	 iv_ruleJvmArgumentTypeReference=ruleJvmArgumentTypeReference 
+	 { $current=$iv_ruleJvmArgumentTypeReference.current; } 
+	 EOF 
+;
+
+// Rule JvmArgumentTypeReference
+ruleJvmArgumentTypeReference returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); 
+    }
+    this_JvmTypeReference_0=ruleJvmTypeReference
+    { 
+        $current = $this_JvmTypeReference_0.current; 
+        afterParserOrEnumRuleCall();
+    }
+
+    |
+    { 
+        newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); 
+    }
+    this_JvmWildcardTypeReference_1=ruleJvmWildcardTypeReference
+    { 
+        $current = $this_JvmWildcardTypeReference_1.current; 
+        afterParserOrEnumRuleCall();
+    }
+)
+;
+
+
+
+
+
+// Entry rule entryRuleJvmWildcardTypeReference
+entryRuleJvmWildcardTypeReference returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceRule()); }
+	 iv_ruleJvmWildcardTypeReference=ruleJvmWildcardTypeReference 
+	 { $current=$iv_ruleJvmWildcardTypeReference.current; } 
+	 EOF 
+;
+
+// Rule JvmWildcardTypeReference
+ruleJvmWildcardTypeReference returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+((
+    {
+        $current = forceCreateModelElement(
+            grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
+            $current);
+    }
+)	otherlv_1='?' 
+    {
+    	newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
+    }
+(((
+(
+		{ 
+	        newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0()); 
+	    }
+		lv_constraints_2_0=ruleJvmUpperBound		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getJvmWildcardTypeReferenceRule());
+	        }
+       		add(
+       			$current, 
+       			"constraints",
+        		lv_constraints_2_0, 
+        		"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();
+	    }
+
+)
+)*))?)
+;
+
+
+
+
+
+// Entry rule entryRuleJvmUpperBound
+entryRuleJvmUpperBound returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getJvmUpperBoundRule()); }
+	 iv_ruleJvmUpperBound=ruleJvmUpperBound 
+	 { $current=$iv_ruleJvmUpperBound.current; } 
+	 EOF 
+;
+
+// Rule JvmUpperBound
+ruleJvmUpperBound returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='extends' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+	    }
+		lv_typeReference_1_0=ruleJvmTypeReference		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getJvmUpperBoundRule());
+	        }
+       		set(
+       			$current, 
+       			"typeReference",
+        		lv_typeReference_1_0, 
+        		"JvmTypeReference");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleJvmUpperBoundAnded
+entryRuleJvmUpperBoundAnded returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getJvmUpperBoundAndedRule()); }
+	 iv_ruleJvmUpperBoundAnded=ruleJvmUpperBoundAnded 
+	 { $current=$iv_ruleJvmUpperBoundAnded.current; } 
+	 EOF 
+;
+
+// Rule JvmUpperBoundAnded
+ruleJvmUpperBoundAnded returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='&' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+	    }
+		lv_typeReference_1_0=ruleJvmTypeReference		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getJvmUpperBoundAndedRule());
+	        }
+       		set(
+       			$current, 
+       			"typeReference",
+        		lv_typeReference_1_0, 
+        		"JvmTypeReference");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleJvmLowerBound
+entryRuleJvmLowerBound returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getJvmLowerBoundRule()); }
+	 iv_ruleJvmLowerBound=ruleJvmLowerBound 
+	 { $current=$iv_ruleJvmLowerBound.current; } 
+	 EOF 
+;
+
+// Rule JvmLowerBound
+ruleJvmLowerBound returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='super' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+	    }
+		lv_typeReference_1_0=ruleJvmTypeReference		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getJvmLowerBoundRule());
+	        }
+       		set(
+       			$current, 
+       			"typeReference",
+        		lv_typeReference_1_0, 
+        		"JvmTypeReference");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
+// Entry rule entryRuleJvmLowerBoundAnded
+entryRuleJvmLowerBoundAnded returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getJvmLowerBoundAndedRule()); }
+	 iv_ruleJvmLowerBoundAnded=ruleJvmLowerBoundAnded 
+	 { $current=$iv_ruleJvmLowerBoundAnded.current; } 
+	 EOF 
+;
+
+// Rule JvmLowerBoundAnded
+ruleJvmLowerBoundAnded returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	otherlv_0='&' 
+    {
+    	newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
+    }
+(
+(
+		{ 
+	        newCompositeNode(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+	    }
+		lv_typeReference_1_0=ruleJvmTypeReference		{
+	        if ($current==null) {
+	            $current = createModelElementForParent(grammarAccess.getJvmLowerBoundAndedRule());
+	        }
+       		set(
+       			$current, 
+       			"typeReference",
+        		lv_typeReference_1_0, 
+        		"JvmTypeReference");
+	        afterParserOrEnumRuleCall();
+	    }
+
+)
+))
+;
+
+
+
+
+
+
+
+// Entry rule entryRuleQualifiedNameWithWildcard
+entryRuleQualifiedNameWithWildcard returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getQualifiedNameWithWildcardRule()); } 
+	 iv_ruleQualifiedNameWithWildcard=ruleQualifiedNameWithWildcard 
+	 { $current=$iv_ruleQualifiedNameWithWildcard.current.getText(); }  
+	 EOF 
+;
+
+// Rule QualifiedNameWithWildcard
+ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0()); 
+    }
+    this_QualifiedName_0=ruleQualifiedName    {
+		$current.merge(this_QualifiedName_0);
+    }
+
+    { 
+        afterParserOrEnumRuleCall();
+    }
+
+	kw='.' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1()); 
+    }
+
+	kw='*' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2()); 
+    }
+)
+    ;
+
+
+
+
+
+
+
+// Entry rule entryRuleXImportDeclaration
+entryRuleXImportDeclaration returns [EObject current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getXImportDeclarationRule()); }
+	 iv_ruleXImportDeclaration=ruleXImportDeclaration 
+	 { $current=$iv_ruleXImportDeclaration.current; } 
+	 EOF 
+;
+
+// Rule XImportDeclaration
+ruleXImportDeclaration returns [EObject current=null] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(	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");
+	    }
+
+)
+)?(
+(
+		{
+			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());
+    }
+)?)
+;
+
+
+
+
+
+// Entry rule entryRuleQualifiedNameInStaticImport
+entryRuleQualifiedNameInStaticImport returns [String current=null] 
+	:
+	{ newCompositeNode(grammarAccess.getQualifiedNameInStaticImportRule()); } 
+	 iv_ruleQualifiedNameInStaticImport=ruleQualifiedNameInStaticImport 
+	 { $current=$iv_ruleQualifiedNameInStaticImport.current.getText(); }  
+	 EOF 
+;
+
+// Rule QualifiedNameInStaticImport
+ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] 
+    @init { enterRule(); 
+    }
+    @after { leaveRule(); }:
+(
+    { 
+        newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0()); 
+    }
+    this_ValidID_0=ruleValidID    {
+		$current.merge(this_ValidID_0);
+    }
+
+    { 
+        afterParserOrEnumRuleCall();
+    }
+
+	kw='.' 
+    {
+        $current.merge(kw);
+        newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1()); 
+    }
+)+
+    ;
+
+
+
+
+
+// Rule 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()); 
+    }
+));
+
+
+
+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/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.tokens b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.tokens
new file mode 100644
index 0000000..00d2fac
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.tokens
@@ -0,0 +1,131 @@
+'&&'=20
+'&'=61
+'('=41
+')'=42
+'*'=63
+'+'=51
+','=55
+'-'=52
+'.'=26
+';'=67
+'<'=57
+'='=22
+'=>'=56
+'>'=58
+'?'=59
+'['=53
+']'=54
+'boolStyle'=30
+'buttonStyle'=27
+'currency'=45
+'dateStyle'=31
+'equal'=68
+'eventTopic'=28
+'extends'=60
+'extension'=66
+'filters'=19
+'for'=14
+'format'=32
+'greater equal'=69
+'greater than'=70
+'greenFrom'=37
+'gridsource'=13
+'htmlStyle'=29
+'imageStyle'=47
+'import'=64
+'indicatorStyle'=36
+'input:'=23
+'inputType'=18
+'inputs'=16
+'lower equal'=71
+'lower than'=72
+'max'=35
+'not equal'=73
+'number'=48
+'numberStyle'=33
+'priceStyle'=44
+'progressbarStyle'=34
+'prop'=24
+'quantityStyle'=39
+'redUntil'=38
+'root:'=21
+'static'=65
+'string'=50
+'style'=25
+'super'=62
+'textStyle'=46
+'then'=49
+'uom'=43
+'value'=40
+'{'=15
+'}'=17
+RULE_ANY_OTHER=12
+RULE_EVENT_TOPIC=8
+RULE_ID=4
+RULE_INT=7
+RULE_ML_COMMENT=9
+RULE_SL_COMMENT=10
+RULE_STRING=5
+RULE_THEME_RESOURCE=6
+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/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
new file mode 100644
index 0000000..debae8b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSourceLexer.java
@@ -0,0 +1,3046 @@
+/**
+ *                                                                            
+ *  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;
+
+// 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.parser.antlr.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=7;
+    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=5;
+    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=6;
+    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 "../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/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'
+            {
+            match("gridsource"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__13"
+
+    // $ANTLR start "T__14"
+    public final void mT__14() throws RecognitionException {
+        try {
+            int _type = T__14;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("for"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__14"
+
+    // $ANTLR start "T__15"
+    public final void mT__15() throws RecognitionException {
+        try {
+            int _type = T__15;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: '{'
+            {
+            match('{'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__15"
+
+    // $ANTLR start "T__16"
+    public final void mT__16() throws RecognitionException {
+        try {
+            int _type = T__16;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("inputs"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__16"
+
+    // $ANTLR start "T__17"
+    public final void mT__17() throws RecognitionException {
+        try {
+            int _type = T__17;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: '}'
+            {
+            match('}'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__17"
+
+    // $ANTLR start "T__18"
+    public final void mT__18() throws RecognitionException {
+        try {
+            int _type = T__18;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("inputType"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__18"
+
+    // $ANTLR start "T__19"
+    public final void mT__19() throws RecognitionException {
+        try {
+            int _type = T__19;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("filters"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__19"
+
+    // $ANTLR start "T__20"
+    public final void mT__20() throws RecognitionException {
+        try {
+            int _type = T__20;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: '&&'
+            {
+            match("&&"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__20"
+
+    // $ANTLR start "T__21"
+    public final void mT__21() throws RecognitionException {
+        try {
+            int _type = T__21;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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:'
+            {
+            match("root:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__21"
+
+    // $ANTLR start "T__22"
+    public final void mT__22() throws RecognitionException {
+        try {
+            int _type = T__22;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: '='
+            {
+            match('='); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__22"
+
+    // $ANTLR start "T__23"
+    public final void mT__23() throws RecognitionException {
+        try {
+            int _type = T__23;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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:'
+            {
+            match("input:"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__23"
+
+    // $ANTLR start "T__24"
+    public final void mT__24() throws RecognitionException {
+        try {
+            int _type = T__24;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("prop"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__24"
+
+    // $ANTLR start "T__25"
+    public final void mT__25() throws RecognitionException {
+        try {
+            int _type = T__25;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("style"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__25"
+
+    // $ANTLR start "T__26"
+    public final void mT__26() throws RecognitionException {
+        try {
+            int _type = T__26;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: '.'
+            {
+            match('.'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__26"
+
+    // $ANTLR start "T__27"
+    public final void mT__27() throws RecognitionException {
+        try {
+            int _type = T__27;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("buttonStyle"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__27"
+
+    // $ANTLR start "T__28"
+    public final void mT__28() throws RecognitionException {
+        try {
+            int _type = T__28;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("eventTopic"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__28"
+
+    // $ANTLR start "T__29"
+    public final void mT__29() throws RecognitionException {
+        try {
+            int _type = T__29;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("htmlStyle"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__29"
+
+    // $ANTLR start "T__30"
+    public final void mT__30() throws RecognitionException {
+        try {
+            int _type = T__30;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("boolStyle"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__30"
+
+    // $ANTLR start "T__31"
+    public final void mT__31() throws RecognitionException {
+        try {
+            int _type = T__31;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("dateStyle"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__31"
+
+    // $ANTLR start "T__32"
+    public final void mT__32() throws RecognitionException {
+        try {
+            int _type = T__32;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("format"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__32"
+
+    // $ANTLR start "T__33"
+    public final void mT__33() throws RecognitionException {
+        try {
+            int _type = T__33;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("numberStyle"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__33"
+
+    // $ANTLR start "T__34"
+    public final void mT__34() throws RecognitionException {
+        try {
+            int _type = T__34;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("progressbarStyle"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__34"
+
+    // $ANTLR start "T__35"
+    public final void mT__35() throws RecognitionException {
+        try {
+            int _type = T__35;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("max"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__35"
+
+    // $ANTLR start "T__36"
+    public final void mT__36() throws RecognitionException {
+        try {
+            int _type = T__36;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("indicatorStyle"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__36"
+
+    // $ANTLR start "T__37"
+    public final void mT__37() throws RecognitionException {
+        try {
+            int _type = T__37;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("greenFrom"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__37"
+
+    // $ANTLR start "T__38"
+    public final void mT__38() throws RecognitionException {
+        try {
+            int _type = T__38;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("redUntil"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__38"
+
+    // $ANTLR start "T__39"
+    public final void mT__39() throws RecognitionException {
+        try {
+            int _type = T__39;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("quantityStyle"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__39"
+
+    // $ANTLR start "T__40"
+    public final void mT__40() throws RecognitionException {
+        try {
+            int _type = T__40;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("value"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__40"
+
+    // $ANTLR start "T__41"
+    public final void mT__41() throws RecognitionException {
+        try {
+            int _type = T__41;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: '('
+            {
+            match('('); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__41"
+
+    // $ANTLR start "T__42"
+    public final void mT__42() throws RecognitionException {
+        try {
+            int _type = T__42;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: ')'
+            {
+            match(')'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__42"
+
+    // $ANTLR start "T__43"
+    public final void mT__43() throws RecognitionException {
+        try {
+            int _type = T__43;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("uom"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__43"
+
+    // $ANTLR start "T__44"
+    public final void mT__44() throws RecognitionException {
+        try {
+            int _type = T__44;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("priceStyle"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__44"
+
+    // $ANTLR start "T__45"
+    public final void mT__45() throws RecognitionException {
+        try {
+            int _type = T__45;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("currency"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__45"
+
+    // $ANTLR start "T__46"
+    public final void mT__46() throws RecognitionException {
+        try {
+            int _type = T__46;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("textStyle"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__46"
+
+    // $ANTLR start "T__47"
+    public final void mT__47() throws RecognitionException {
+        try {
+            int _type = T__47;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("imageStyle"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__47"
+
+    // $ANTLR start "T__48"
+    public final void mT__48() throws RecognitionException {
+        try {
+            int _type = T__48;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("number"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__48"
+
+    // $ANTLR start "T__49"
+    public final void mT__49() throws RecognitionException {
+        try {
+            int _type = T__49;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("then"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__49"
+
+    // $ANTLR start "T__50"
+    public final void mT__50() throws RecognitionException {
+        try {
+            int _type = T__50;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("string"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__50"
+
+    // $ANTLR start "T__51"
+    public final void mT__51() throws RecognitionException {
+        try {
+            int _type = T__51;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: '+'
+            {
+            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;
+            // ../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: '-'
+            {
+            match('-'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__52"
+
+    // $ANTLR start "T__53"
+    public final void mT__53() throws RecognitionException {
+        try {
+            int _type = T__53;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: '['
+            {
+            match('['); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__53"
+
+    // $ANTLR start "T__54"
+    public final void mT__54() throws RecognitionException {
+        try {
+            int _type = T__54;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: ']'
+            {
+            match(']'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__54"
+
+    // $ANTLR start "T__55"
+    public final void mT__55() throws RecognitionException {
+        try {
+            int _type = T__55;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: ','
+            {
+            match(','); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__55"
+
+    // $ANTLR start "T__56"
+    public final void mT__56() throws RecognitionException {
+        try {
+            int _type = T__56;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: '=>'
+            {
+            match("=>"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__56"
+
+    // $ANTLR start "T__57"
+    public final void mT__57() throws RecognitionException {
+        try {
+            int _type = T__57;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: '<'
+            {
+            match('<'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__57"
+
+    // $ANTLR start "T__58"
+    public final void mT__58() throws RecognitionException {
+        try {
+            int _type = T__58;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../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: '>'
+            {
+            match('>'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__58"
+
+    // $ANTLR start "T__59"
+    public final void mT__59() throws RecognitionException {
+        try {
+            int _type = T__59;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../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: '?'
+            {
+            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;
+            // ../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'
+            {
+            match("extends"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__60"
+
+    // $ANTLR start "T__61"
+    public final void mT__61() throws RecognitionException {
+        try {
+            int _type = T__61;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: '&'
+            {
+            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;
+            // ../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'
+            {
+            match("super"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__62"
+
+    // $ANTLR start "T__63"
+    public final void mT__63() throws RecognitionException {
+        try {
+            int _type = T__63;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: '*'
+            {
+            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;
+            // ../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'
+            {
+            match("import"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__64"
+
+    // $ANTLR start "T__65"
+    public final void mT__65() throws RecognitionException {
+        try {
+            int _type = T__65;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("static"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__65"
+
+    // $ANTLR start "T__66"
+    public final void mT__66() throws RecognitionException {
+        try {
+            int _type = T__66;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("extension"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__66"
+
+    // $ANTLR start "T__67"
+    public final void mT__67() throws RecognitionException {
+        try {
+            int _type = T__67;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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: ';'
+            {
+            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;
+            // ../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'
+            {
+            match("equal"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__68"
+
+    // $ANTLR start "T__69"
+    public final void mT__69() throws RecognitionException {
+        try {
+            int _type = T__69;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("greater equal"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__69"
+
+    // $ANTLR start "T__70"
+    public final void mT__70() throws RecognitionException {
+        try {
+            int _type = T__70;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("greater than"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__70"
+
+    // $ANTLR start "T__71"
+    public final void mT__71() throws RecognitionException {
+        try {
+            int _type = T__71;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("lower equal"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__71"
+
+    // $ANTLR start "T__72"
+    public final void mT__72() throws RecognitionException {
+        try {
+            int _type = T__72;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("lower than"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__72"
+
+    // $ANTLR start "T__73"
+    public final void mT__73() throws RecognitionException {
+        try {
+            int _type = T__73;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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'
+            {
+            match("not equal"); 
+
+
+            }
+
+            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;
+            // ../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' )*
+            {
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2685:11: ( '^' )?
+            int alt1=2;
+            int LA1_0 = input.LA(1);
+
+            if ( (LA1_0=='^') ) {
+                alt1=1;
+            }
+            switch (alt1) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2685:11: '^'
+                    {
+                    match('^'); 
+
+                    }
+                    break;
+
+            }
+
+            if ( input.LA(1)=='$'||(input.LA(1)>='A' && input.LA(1)<='Z')||input.LA(1)=='_'||(input.LA(1)>='a' && input.LA(1)<='z') ) {
+                input.consume();
+
+            }
+            else {
+                MismatchedSetException mse = new MismatchedSetException(null,input);
+                recover(mse);
+                throw mse;}
+
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2685:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( (LA2_0=='$'||(LA2_0>='0' && LA2_0<='9')||(LA2_0>='A' && LA2_0<='Z')||LA2_0=='_'||(LA2_0>='a' && LA2_0<='z')) ) {
+                    alt2=1;
+                }
+
+
+                switch (alt2) {
+            	case 1 :
+            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/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;
+            // ../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' | '_' )*
+            {
+            matchRange('0','9'); 
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2687: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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/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;
+            // ../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' )*
+            {
+            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' )*
+            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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/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;
+            // ../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 )* ( '/*' )? '\\''
+            {
+            match('\''); 
+            mRULE_ID(); 
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2691: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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2691:34: '/' RULE_ID
+            	    {
+            	    match('/'); 
+            	    mRULE_ID(); 
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop5;
+                }
+            } while (true);
+
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2691:48: ( '/*' )?
+            int alt6=2;
+            int LA6_0 = input.LA(1);
+
+            if ( (LA6_0=='/') ) {
+                alt6=1;
+            }
+            switch (alt6) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2691: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;
+            // ../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: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            {
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693: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 :
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
+                    {
+                    match('\"'); 
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693: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 :
+                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:21: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693: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);
+
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:44: ( '\"' )?
+                    int alt8=2;
+                    int LA8_0 = input.LA(1);
+
+                    if ( (LA8_0=='\"') ) {
+                        alt8=1;
+                    }
+                    switch (alt8) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:44: '\"'
+                            {
+                            match('\"'); 
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
+                    {
+                    match('\''); 
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693: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 :
+                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:55: '\\\\' .
+                    	    {
+                    	    match('\\'); 
+                    	    matchAny(); 
+
+                    	    }
+                    	    break;
+                    	case 2 :
+                    	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693: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);
+
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:79: ( '\\'' )?
+                    int alt10=2;
+                    int LA10_0 = input.LA(1);
+
+                    if ( (LA10_0=='\'') ) {
+                        alt10=1;
+                    }
+                    switch (alt10) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2693:79: '\\''
+                            {
+                            match('\''); 
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_STRING"
+
+    // $ANTLR start "RULE_ML_COMMENT"
+    public final void mRULE_ML_COMMENT() throws RecognitionException {
+        try {
+            int _type = RULE_ML_COMMENT;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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; } : . )* '*/'
+            {
+            match("/*"); 
+
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2695: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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2695: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;
+            // ../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' )?
+            {
+            match("//"); 
+
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2697: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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2697: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);
+
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2697: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 :
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2697:41: ( '\\r' )? '\\n'
+                    {
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2697:41: ( '\\r' )?
+                    int alt14=2;
+                    int LA14_0 = input.LA(1);
+
+                    if ( (LA14_0=='\r') ) {
+                        alt14=1;
+                    }
+                    switch (alt14) {
+                        case 1 :
+                            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2697:41: '\\r'
+                            {
+                            match('\r'); 
+
+                            }
+                            break;
+
+                    }
+
+                    match('\n'); 
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "RULE_SL_COMMENT"
+
+    // $ANTLR start "RULE_WS"
+    public final void mRULE_WS() throws RecognitionException {
+        try {
+            int _type = RULE_WS;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // ../org.eclipse.osbp.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' )+
+            {
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2699: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 :
+            	    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/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;
+            // ../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: .
+            {
+            matchAny(); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $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 )
+        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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                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
+                {
+                mRULE_ANY_OTHER(); 
+
+                }
+                break;
+
+        }
+
+    }
+
+
+    protected DFA17 dfa17 = new DFA17(this);
+    static final String DFA17_eotS =
+        "\1\uffff\2\55\1\uffff\1\55\1\uffff\1\65\1\55\1\71\2\55\1\uffff\10\55\2\uffff\3\55\12\uffff\1\55\1\53\2\uffff\1\134\1\uffff\1\53\2\uffff\1\55\1\uffff\2\55\1\uffff\2\55\3\uffff\2\55\2\uffff\3\55\1\uffff\14\55\2\uffff\4\55\12\uffff\1\55\2\uffff\2\134\3\uffff\2\55\1\u008a\26\55\1\u00a2\2\55\1\u00a5\4\55\2\134\1\uffff\4\55\1\uffff\7\55\1\u00ba\16\55\2\uffff\2\55\1\uffff\2\55\1\u00cd\2\55\3\134\1\uffff\11\55\1\uffff\1\55\1\uffff\2\55\1\u00df\2\55\1\u00e2\4\55\1\u00e8\4\55\1\u00ed\2\55\1\uffff\2\55\1\134\3\55\1\u00f5\1\55\1\u00f7\1\55\1\uffff\2\55\1\u00fb\3\55\1\uffff\1\u00ff\1\u0100\1\uffff\5\55\1\uffff\2\55\1\u0109\1\55\1\uffff\2\55\2\uffff\3\55\1\uffff\1\u0112\1\uffff\3\55\1\uffff\3\55\2\uffff\3\55\1\u011c\4\55\1\uffff\3\55\2\uffff\2\55\2\uffff\3\55\1\u012b\5\55\1\uffff\5\55\1\u0136\2\55\1\u0139\2\uffff\1\u013a\2\55\1\uffff\3\55\1\u0140\1\55\1\u0142\1\u0143\1\u0144\2\55\1\uffff\1\u0147\1\u0148\2\uffff\1\55\1\u014a\1\55\1\u014c\1\55\1\uffff\1\u014e\3\uffff\2\55\2\uffff\1\55\1\uffff\1\55\1\uffff\1\u0153\1\uffff\1\u0154\3\55\2\uffff\3\55\1\u015b\1\u015c\1\55\2\uffff\1\55\1\u015f\1\uffff";
+    static final String DFA17_eofS =
+        "\u0160\uffff";
+    static final String DFA17_minS =
+        "\1\0\1\162\1\151\1\uffff\1\155\1\uffff\1\46\1\145\1\76\1\162\1\164\1\uffff\1\157\1\161\1\164\1\141\1\157\1\141\1\165\1\141\2\uffff\1\157\1\165\1\145\12\uffff\1\157\1\44\2\uffff\1\44\1\uffff\1\52\2\uffff\1\145\1\uffff\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\145\1\164\1\165\1\155\1\164\1\155\1\164\1\170\1\141\1\154\2\uffff\1\155\1\162\1\170\1\145\12\uffff\1\167\2\uffff\2\44\3\uffff\1\144\1\141\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\1\154\1\156\1\145\1\141\1\154\1\145\1\142\1\40\1\44\1\156\1\165\1\44\1\162\1\164\1\155\1\145\2\44\1\uffff\1\163\1\156\1\164\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\1\123\1\164\1\156\1\154\2\123\1\145\2\uffff\1\164\1\145\1\uffff\1\145\1\123\1\44\1\145\1\162\1\47\2\44\1\uffff\1\157\1\106\1\145\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\1\164\1\124\1\144\1\44\2\164\1\162\1\151\1\44\1\156\1\164\1\uffff\1\72\1\40\1\44\1\165\2\162\1\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\1\171\1\157\1\163\1\151\1\uffff\2\171\1\44\1\164\1\uffff\1\143\1\171\1\uffff\1\145\1\162\1\157\1\40\1\uffff\1\44\1\uffff\1\160\1\157\1\171\1\uffff\1\154\1\163\1\171\2\uffff\1\164\1\154\1\160\1\44\1\157\2\154\1\164\1\uffff\2\171\1\154\2\uffff\1\143\1\155\1\145\1\uffff\1\145\1\162\1\154\1\44\1\142\1\154\1\171\1\145\1\151\1\uffff\1\156\2\145\1\171\1\123\1\44\2\145\1\44\2\uffff\1\44\1\123\1\145\1\uffff\1\141\1\145\1\154\1\44\1\143\3\44\1\154\1\164\1\uffff\2\44\2\uffff\1\164\1\44\1\162\1\44\1\145\1\uffff\1\44\3\uffff\1\145\1\171\2\uffff\1\171\1\uffff\1\123\1\uffff\1\44\1\uffff\1\44\2\154\1\164\2\uffff\2\145\1\171\2\44\1\154\2\uffff\1\145\1\44\1\uffff";
+    static final String DFA17_maxS =
+        "\1\uffff\1\162\1\157\1\uffff\1\156\1\uffff\1\46\1\157\1\76\1\162\1\165\1\uffff\1\165\1\170\1\164\1\141\1\165\1\141\1\165\1\141\2\uffff\1\157\1\165\1\150\12\uffff\1\157\1\172\2\uffff\1\172\1\uffff\1\57\2\uffff\1\151\1\uffff\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\145\1\164\1\165\1\155\1\164\1\155\1\164\1\170\1\141\1\154\2\uffff\1\155\1\162\1\170\1\145\12\uffff\1\167\2\uffff\2\172\3\uffff\1\144\1\145\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\1\154\1\156\1\145\1\141\1\154\1\145\1\142\1\40\1\172\1\156\1\165\1\172\1\162\1\164\1\156\1\145\2\172\1\uffff\1\163\1\156\1\164\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\1\123\1\164\1\156\1\154\2\123\1\145\2\uffff\1\164\1\145\1\uffff\1\145\1\123\1\172\1\145\1\162\1\47\2\172\1\uffff\1\157\1\106\1\145\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\1\164\1\124\1\163\1\172\2\164\1\162\1\151\1\172\1\156\1\164\1\uffff\1\72\1\40\1\172\1\165\2\162\1\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\1\171\1\157\1\163\1\151\1\uffff\2\171\1\172\1\164\1\uffff\1\143\1\171\1\uffff\1\164\1\162\1\157\1\40\1\uffff\1\172\1\uffff\1\160\1\157\1\171\1\uffff\1\154\1\163\1\171\2\uffff\1\164\1\154\1\160\1\172\1\157\2\154\1\164\1\uffff\2\171\1\154\2\uffff\1\143\1\155\1\164\1\uffff\1\145\1\162\1\154\1\172\1\142\1\154\1\171\1\145\1\151\1\uffff\1\156\2\145\1\171\1\123\1\172\2\145\1\172\2\uffff\1\172\1\123\1\145\1\uffff\1\141\1\145\1\154\1\172\1\143\3\172\1\154\1\164\1\uffff\2\172\2\uffff\1\164\1\172\1\162\1\172\1\145\1\uffff\1\172\3\uffff\1\145\1\171\2\uffff\1\171\1\uffff\1\123\1\uffff\1\172\1\uffff\1\172\2\154\1\164\2\uffff\2\145\1\171\2\172\1\154\2\uffff\1\145\1\172\1\uffff";
+    static final String DFA17_acceptS =
+        "\3\uffff\1\3\1\uffff\1\5\5\uffff\1\16\10\uffff\1\35\1\36\3\uffff\1\47\1\50\1\51\1\52\1\53\1\55\1\56\1\57\1\63\1\67\2\uffff\1\76\1\77\1\uffff\1\102\1\uffff\1\105\1\106\1\uffff\1\76\2\uffff\1\3\2\uffff\1\5\1\10\1\61\2\uffff\1\54\1\12\3\uffff\1\16\14\uffff\1\35\1\36\4\uffff\1\47\1\50\1\51\1\52\1\53\1\55\1\56\1\57\1\63\1\67\1\uffff\1\77\1\102\2\uffff\1\103\1\104\1\105\43\uffff\1\101\4\uffff\1\2\26\uffff\1\75\1\27\2\uffff\1\37\10\uffff\1\101\11\uffff\1\11\1\uffff\1\14\22\uffff\1\45\12\uffff\1\13\6\uffff\1\15\2\uffff\1\62\5\uffff\1\70\4\uffff\1\34\2\uffff\1\100\4\uffff\1\24\1\uffff\1\4\3\uffff\1\64\3\uffff\1\46\1\65\10\uffff\1\44\3\uffff\1\73\1\74\3\uffff\1\7\11\uffff\1\60\11\uffff\1\71\1\72\3\uffff\1\32\12\uffff\1\41\2\uffff\1\31\1\6\5\uffff\1\22\1\uffff\1\66\1\21\1\23\2\uffff\1\42\1\1\1\uffff\1\43\1\uffff\1\40\1\uffff\1\20\4\uffff\1\17\1\25\6\uffff\1\33\1\30\2\uffff\1\26";
+    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\6\1\47\1\24\1\25\1\41\1\31\1\35\1\32\1\13\1\51\12\46\1\53\1\42\1\36\1\10\1\37\1\40\1\53\32\45\1\33\1\53\1\34\1\44\1\45\1\53\1\45\1\14\1\27\1\17\1\15\1\2\1\1\1\16\1\4\2\45\1\43\1\21\1\20\1\45\1\11\1\22\1\7\1\12\1\30\1\26\1\23\4\45\1\3\1\53\1\5\uff82\53",
+            "\1\54",
+            "\1\57\5\uffff\1\56",
+            "",
+            "\1\62\1\61",
+            "",
+            "\1\64",
+            "\1\67\11\uffff\1\66",
+            "\1\70",
+            "\1\72",
+            "\1\73\1\74",
+            "",
+            "\1\77\5\uffff\1\76",
+            "\1\102\4\uffff\1\100\1\uffff\1\101",
+            "\1\103",
+            "\1\104",
+            "\1\106\5\uffff\1\105",
+            "\1\107",
+            "\1\110",
+            "\1\111",
+            "",
+            "",
+            "\1\114",
+            "\1\115",
+            "\1\116\2\uffff\1\117",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\132",
+            "\1\55\34\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "",
+            "",
+            "\1\136\34\uffff\32\136\3\uffff\1\135\1\136\1\uffff\32\136",
+            "",
+            "\1\137\4\uffff\1\140",
+            "",
+            "",
+            "\1\143\3\uffff\1\142",
+            "",
+            "\1\144",
+            "\1\145",
+            "",
+            "\1\147\13\uffff\1\146",
+            "\1\150\16\uffff\1\151",
+            "",
+            "",
+            "",
+            "\1\152",
+            "\1\153",
+            "",
+            "",
+            "\1\155\5\uffff\1\154",
+            "\1\160\20\uffff\1\157\6\uffff\1\156",
+            "\1\161",
+            "",
+            "\1\162",
+            "\1\163",
+            "\1\164",
+            "\1\165",
+            "\1\166",
+            "\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\u0088\3\uffff\1\u0087",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\14\55\1\u0089\15\55",
+            "\1\u008b",
+            "\1\u008c",
+            "\1\u008d",
+            "\1\u008e",
+            "\1\u008f",
+            "\1\u0090",
+            "\1\u0091",
+            "\1\u0093\10\uffff\1\u0092",
+            "\1\u0094",
+            "\1\u0095",
+            "\1\u0096",
+            "\1\u0097",
+            "\1\u0098",
+            "\1\u0099",
+            "\1\u009a",
+            "\1\u009b",
+            "\1\u009c",
+            "\1\u009d",
+            "\1\u009e",
+            "\1\u009f",
+            "\1\u00a0",
+            "\1\u00a1",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u00a3",
+            "\1\u00a4",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u00a6",
+            "\1\u00a7",
+            "\1\u00a9\1\u00a8",
+            "\1\u00aa",
+            "\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\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u00bb",
+            "\1\u00bc",
+            "\1\u00bd",
+            "\1\u00be",
+            "\1\u00bf",
+            "\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\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u00ce",
+            "\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\u00d1",
+            "\1\u00d2",
+            "\1\u00d3",
+            "\1\u00d4",
+            "\1\u00d5",
+            "\1\u00d8\31\uffff\1\u00d7\36\uffff\1\u00d6",
+            "\1\u00d9",
+            "\1\u00da",
+            "\1\u00db",
+            "",
+            "\1\u00dc",
+            "",
+            "\1\u00dd",
+            "\1\u00de",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u00e0",
+            "\1\u00e1",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u00e3",
+            "\1\u00e4",
+            "\1\u00e5",
+            "\1\u00e6\16\uffff\1\u00e7",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u00e9",
+            "\1\u00ea",
+            "\1\u00eb",
+            "\1\u00ec",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u00ee",
+            "\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\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u00f6",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u00f8",
+            "",
+            "\1\u00f9",
+            "\1\u00fa",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u00fc",
+            "\1\u00fd",
+            "\1\u00fe",
+            "",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "",
+            "\1\u0101",
+            "\1\u0102",
+            "\1\u0103",
+            "\1\u0104",
+            "\1\u0105",
+            "",
+            "\1\u0106",
+            "\1\u0107",
+            "\1\55\13\uffff\12\55\7\uffff\22\55\1\u0108\7\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u010a",
+            "",
+            "\1\u010b",
+            "\1\u010c",
+            "",
+            "\1\u010d\16\uffff\1\u010e",
+            "\1\u010f",
+            "\1\u0110",
+            "\1\u0111",
+            "",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "",
+            "\1\u0113",
+            "\1\u0114",
+            "\1\u0115",
+            "",
+            "\1\u0116",
+            "\1\u0117",
+            "\1\u0118",
+            "",
+            "",
+            "\1\u0119",
+            "\1\u011a",
+            "\1\u011b",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\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\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u012c",
+            "\1\u012d",
+            "\1\u012e",
+            "\1\u012f",
+            "\1\u0130",
+            "",
+            "\1\u0131",
+            "\1\u0132",
+            "\1\u0133",
+            "\1\u0134",
+            "\1\u0135",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u0137",
+            "\1\u0138",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "",
+            "",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u013b",
+            "\1\u013c",
+            "",
+            "\1\u013d",
+            "\1\u013e",
+            "\1\u013f",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u0141",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u0145",
+            "\1\u0146",
+            "",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "",
+            "",
+            "\1\u0149",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u014b",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u014d",
+            "",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "",
+            "",
+            "",
+            "\1\u014f",
+            "\1\u0150",
+            "",
+            "",
+            "\1\u0151",
+            "",
+            "\1\u0152",
+            "",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u0155",
+            "\1\u0156",
+            "\1\u0157",
+            "",
+            "",
+            "\1\u0158",
+            "\1\u0159",
+            "\1\u015a",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            "\1\u015d",
+            "",
+            "",
+            "\1\u015e",
+            "\1\55\13\uffff\12\55\7\uffff\32\55\4\uffff\1\55\1\uffff\32\55",
+            ""
+    };
+
+    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=='g') ) {s = 1;}
+
+                        else if ( (LA17_0=='f') ) {s = 2;}
+
+                        else if ( (LA17_0=='{') ) {s = 3;}
+
+                        else if ( (LA17_0=='i') ) {s = 4;}
+
+                        else if ( (LA17_0=='}') ) {s = 5;}
+
+                        else if ( (LA17_0=='&') ) {s = 6;}
+
+                        else if ( (LA17_0=='r') ) {s = 7;}
+
+                        else if ( (LA17_0=='=') ) {s = 8;}
+
+                        else if ( (LA17_0=='p') ) {s = 9;}
+
+                        else if ( (LA17_0=='s') ) {s = 10;}
+
+                        else if ( (LA17_0=='.') ) {s = 11;}
+
+                        else if ( (LA17_0=='b') ) {s = 12;}
+
+                        else if ( (LA17_0=='e') ) {s = 13;}
+
+                        else if ( (LA17_0=='h') ) {s = 14;}
+
+                        else if ( (LA17_0=='d') ) {s = 15;}
+
+                        else if ( (LA17_0=='n') ) {s = 16;}
+
+                        else if ( (LA17_0=='m') ) {s = 17;}
+
+                        else if ( (LA17_0=='q') ) {s = 18;}
+
+                        else if ( (LA17_0=='v') ) {s = 19;}
+
+                        else if ( (LA17_0=='(') ) {s = 20;}
+
+                        else if ( (LA17_0==')') ) {s = 21;}
+
+                        else if ( (LA17_0=='u') ) {s = 22;}
+
+                        else if ( (LA17_0=='c') ) {s = 23;}
+
+                        else if ( (LA17_0=='t') ) {s = 24;}
+
+                        else if ( (LA17_0=='+') ) {s = 25;}
+
+                        else if ( (LA17_0=='-') ) {s = 26;}
+
+                        else if ( (LA17_0=='[') ) {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=='l') ) {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;
+        }
+    }
+ 
+
+}
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
new file mode 100644
index 0000000..b5904aa
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSourceParser.java
@@ -0,0 +1,8005 @@
+/**
+ *                                                                            
+ *  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; 
+
+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.emf.common.util.Enumerator;
+import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream;
+import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
+import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
+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 AbstractInternalAntlrParser {
+    public static final String[] tokenNames = new String[] {
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_ID", "RULE_STRING", "RULE_THEME_RESOURCE", "RULE_INT", "RULE_EVENT_TOPIC", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'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'", "';'", "'equal'", "'greater equal'", "'greater than'", "'lower equal'", "'lower than'", "'not equal'"
+    };
+    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=7;
+    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=5;
+    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=6;
+    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 "../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/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";	
+       	}
+       	
+       	@Override
+       	protected GridSourceGrammarAccess getGrammarAccess() {
+       		return grammarAccess;
+       	}
+
+
+
+    // $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 ;
+    public final EObject entryRuleSource() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleSource = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getSourceRule()); 
+            }
+            pushFollow(FOLLOW_ruleSource_in_entryRuleSource75);
+            iv_ruleSource=ruleSource();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleSource; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleSource85); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleSource"
+
+
+    // $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= '}' ) ;
+    public final EObject ruleSource() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        Token otherlv_6=null;
+        Token otherlv_8=null;
+        Token otherlv_10=null;
+        AntlrDatatypeRuleToken lv_id_1_0 = null;
+
+        EObject lv_rootType_3_0 = null;
+
+        EObject lv_inputs_7_0 = null;
+
+        EObject lv_properties_9_0 = null;
+
+
+         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= '}' )
+            {
+            // ../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= '}'
+            {
+            otherlv_0=(Token)match(input,13,FOLLOW_13_in_ruleSource122); if (state.failed) return current;
+            if ( state.backtracking==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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getSourceAccess().getIdQualifiedNameParserRuleCall_1_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleQualifiedName_in_ruleSource143);
+            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();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleSource155); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getSourceAccess().getRootTypeJvmTypeReferenceParserRuleCall_3_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleSource176);
+            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();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,15,FOLLOW_15_in_ruleSource188); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_4, grammarAccess.getSourceAccess().getLeftCurlyBracketKeyword_4());
+                  
+            }
+            otherlv_5=(Token)match(input,16,FOLLOW_16_in_ruleSource200); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_5, grammarAccess.getSourceAccess().getInputsKeyword_5());
+                  
+            }
+            otherlv_6=(Token)match(input,15,FOLLOW_15_in_ruleSource212); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 ) )*
+            loop1:
+            do {
+                int alt1=2;
+                int LA1_0 = input.LA(1);
+
+                if ( (LA1_0==18) ) {
+                    alt1=1;
+                }
+
+
+                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 )
+            	    {
+            	    // ../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
+            	    {
+            	    if ( state.backtracking==0 ) {
+            	       
+            	      	        newCompositeNode(grammarAccess.getSourceAccess().getInputsInputParserRuleCall_7_0()); 
+            	      	    
+            	    }
+            	    pushFollow(FOLLOW_ruleInput_in_ruleSource233);
+            	    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();
+            	      	    
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop1;
+                }
+            } while (true);
+
+            otherlv_8=(Token)match(input,17,FOLLOW_17_in_ruleSource246); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 ) )*
+            loop2:
+            do {
+                int alt2=2;
+                int LA2_0 = input.LA(1);
+
+                if ( (LA2_0==24) ) {
+                    alt2=1;
+                }
+
+
+                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 )
+            	    {
+            	    // ../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
+            	    {
+            	    if ( state.backtracking==0 ) {
+            	       
+            	      	        newCompositeNode(grammarAccess.getSourceAccess().getPropertiesPropertyParserRuleCall_9_0()); 
+            	      	    
+            	    }
+            	    pushFollow(FOLLOW_ruleProperty_in_ruleSource267);
+            	    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();
+            	      	    
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop2;
+                }
+            } while (true);
+
+            otherlv_10=(Token)match(input,17,FOLLOW_17_in_ruleSource280); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_10, grammarAccess.getSourceAccess().getRightCurlyBracketKeyword_10());
+                  
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleSource"
+
+
+    // $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 ;
+    public final EObject entryRuleInput() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleInput = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getInputRule()); 
+            }
+            pushFollow(FOLLOW_ruleInput_in_entryRuleInput316);
+            iv_ruleInput=ruleInput();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleInput; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleInput326); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleInput"
+
+
+    // $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 ) ) )* ) ;
+    public final EObject ruleInput() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        EObject lv_inputType_1_0 = null;
+
+        EObject lv_filters_3_0 = null;
+
+        EObject lv_filters_5_0 = null;
+
+
+         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 ) ) )* )
+            {
+            // ../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 ) ) )*
+            {
+            otherlv_0=(Token)match(input,18,FOLLOW_18_in_ruleInput363); if (state.failed) return current;
+            if ( state.backtracking==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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getInputAccess().getInputTypeJvmTypeReferenceParserRuleCall_1_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleInput384);
+            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();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,19,FOLLOW_19_in_ruleInput396); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_3_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleEQFilter_in_ruleInput417);
+            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();
+              	    
+            }
+
+            }
+
+
+            }
+
+            // ../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 ) ) )*
+            loop3:
+            do {
+                int alt3=2;
+                int LA3_0 = input.LA(1);
+
+                if ( (LA3_0==20) ) {
+                    alt3=1;
+                }
+
+
+                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 ) )
+            	    {
+            	    otherlv_4=(Token)match(input,20,FOLLOW_20_in_ruleInput430); if (state.failed) return current;
+            	    if ( state.backtracking==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 )
+            	    {
+            	    // ../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
+            	    {
+            	    if ( state.backtracking==0 ) {
+            	       
+            	      	        newCompositeNode(grammarAccess.getInputAccess().getFiltersEQFilterParserRuleCall_4_1_0()); 
+            	      	    
+            	    }
+            	    pushFollow(FOLLOW_ruleEQFilter_in_ruleInput451);
+            	    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();
+            	      	    
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop3;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleInput"
+
+
+    // $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 ;
+    public final EObject entryRuleEQFilter() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleEQFilter = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getEQFilterRule()); 
+            }
+            pushFollow(FOLLOW_ruleEQFilter_in_entryRuleEQFilter489);
+            iv_ruleEQFilter=ruleEQFilter();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleEQFilter; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleEQFilter499); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleEQFilter"
+
+
+    // $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 ) ) ) ;
+    public final EObject ruleEQFilter() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        EObject lv_rootTypePropertyPath_2_0 = null;
+
+        EObject lv_inputTypePropertyPath_5_0 = null;
+
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getEQFilterAccess().getCxGridSourceEQFilterAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,21,FOLLOW_21_in_ruleEQFilter545); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getEQFilterAccess().getRootTypePropertyPathNestedFieldParserRuleCall_2_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleNestedField_in_ruleEQFilter566);
+            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();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,22,FOLLOW_22_in_ruleEQFilter578); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getEQFilterAccess().getEqualsSignKeyword_3());
+                  
+            }
+            otherlv_4=(Token)match(input,23,FOLLOW_23_in_ruleEQFilter590); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getEQFilterAccess().getInputTypePropertyPathNestedFieldParserRuleCall_5_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleNestedField_in_ruleEQFilter611);
+            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 ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleEQFilter"
+
+
+    // $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 ;
+    public final EObject entryRuleProperty() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleProperty = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPropertyRule()); 
+            }
+            pushFollow(FOLLOW_ruleProperty_in_entryRuleProperty647);
+            iv_ruleProperty=ruleProperty();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleProperty; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleProperty657); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleProperty"
+
+
+    // $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 ) ) ) ;
+    public final EObject ruleProperty() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        EObject lv_path_1_0 = null;
+
+        EObject lv_style_3_0 = null;
+
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            otherlv_0=(Token)match(input,24,FOLLOW_24_in_ruleProperty694); if (state.failed) return current;
+            if ( state.backtracking==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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getPropertyAccess().getPathNestedFieldParserRuleCall_1_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleNestedField_in_ruleProperty715);
+            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();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_2=(Token)match(input,25,FOLLOW_25_in_ruleProperty727); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getPropertyAccess().getStylePropertyStyleParserRuleCall_3_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_rulePropertyStyle_in_ruleProperty748);
+            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 ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleProperty"
+
+
+    // $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 ;
+    public final EObject entryRuleNestedField() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleNestedField = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getNestedFieldRule()); 
+            }
+            pushFollow(FOLLOW_ruleNestedField_in_entryRuleNestedField784);
+            iv_ruleNestedField=ruleNestedField();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleNestedField; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleNestedField794); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleNestedField"
+
+
+    // $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 ) )? ) ;
+    public final EObject ruleNestedField() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_path_2_0 = null;
+
+
+         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 ) )? )
+            {
+            // ../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 ) )?
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getNestedFieldRule());
+              	        }
+                      
+            }
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleNestedField848); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_1, grammarAccess.getNestedFieldAccess().getFieldJvmOperationCrossReference_1_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:448:2: ( (lv_path_2_0= ruleNestedPath ) )?
+            int alt4=2;
+            int LA4_0 = input.LA(1);
+
+            if ( (LA4_0==26) ) {
+                alt4=1;
+            }
+            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 )
+                    {
+                    // ../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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getNestedFieldAccess().getPathNestedPathParserRuleCall_2_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleNestedPath_in_ruleNestedField869);
+                    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();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleNestedField"
+
+
+    // $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 ;
+    public final EObject entryRuleNestedPath() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleNestedPath = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getNestedPathRule()); 
+            }
+            pushFollow(FOLLOW_ruleNestedPath_in_entryRuleNestedPath906);
+            iv_ruleNestedPath=ruleNestedPath();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleNestedPath; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleNestedPath916); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleNestedPath"
+
+
+    // $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 ) )? ) ;
+    public final EObject ruleNestedPath() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        EObject lv_path_3_0 = null;
+
+
+         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 ) )? )
+            {
+            // ../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 ) )?
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getNestedPathAccess().getCxGridNestedPathAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,26,FOLLOW_26_in_ruleNestedPath962); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getNestedPathRule());
+              	        }
+                      
+            }
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleNestedPath982); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		newLeafNode(otherlv_2, grammarAccess.getNestedPathAccess().getFieldJvmOperationCrossReference_2_0()); 
+              	
+            }
+
+            }
+
+
+            }
+
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:510:2: ( (lv_path_3_0= ruleNestedPath ) )?
+            int alt5=2;
+            int LA5_0 = input.LA(1);
+
+            if ( (LA5_0==26) ) {
+                alt5=1;
+            }
+            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 )
+                    {
+                    // ../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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getNestedPathAccess().getPathNestedPathParserRuleCall_3_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleNestedPath_in_ruleNestedPath1003);
+                    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();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleNestedPath"
+
+
+    // $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 ;
+    public final EObject entryRulePropertyStyle() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePropertyStyle = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPropertyStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyStyle_in_entryRulePropertyStyle1040);
+            iv_rulePropertyStyle=rulePropertyStyle();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePropertyStyle; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyStyle1050); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePropertyStyle"
+
+
+    // $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 ) ;
+    public final EObject rulePropertyStyle() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_PropertyButtonStyle_0 = null;
+
+        EObject this_PropertyHtmlStyle_1 = null;
+
+        EObject this_PropertyProgressbarStyle_2 = null;
+
+        EObject this_PropertyTextStyle_3 = null;
+
+        EObject this_PropertyBooleanStyle_4 = null;
+
+        EObject this_PropertyDateStyle_5 = null;
+
+        EObject this_PropertyNumberStyle_6 = null;
+
+        EObject this_PropertyImageStyle_7 = null;
+
+        EObject this_PropertyQuantityStyle_8 = null;
+
+        EObject this_PropertyPriceStyle_9 = null;
+
+        EObject this_GridPropIndicatorStyle_10 = null;
+
+
+         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 )
+            {
+            // ../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 )
+            int alt6=11;
+            switch ( input.LA(1) ) {
+            case 27:
+                {
+                alt6=1;
+                }
+                break;
+            case 29:
+                {
+                alt6=2;
+                }
+                break;
+            case 34:
+                {
+                alt6=3;
+                }
+                break;
+            case 46:
+                {
+                alt6=4;
+                }
+                break;
+            case 30:
+                {
+                alt6=5;
+                }
+                break;
+            case 31:
+                {
+                alt6=6;
+                }
+                break;
+            case 33:
+                {
+                alt6=7;
+                }
+                break;
+            case 47:
+                {
+                alt6=8;
+                }
+                break;
+            case 39:
+                {
+                alt6=9;
+                }
+                break;
+            case 44:
+                {
+                alt6=10;
+                }
+                break;
+            case 36:
+                {
+                alt6=11;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 6, 0, input);
+
+                throw nvae;
+            }
+
+            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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyButtonStyleParserRuleCall_0()); 
+                          
+                    }
+                    pushFollow(FOLLOW_rulePropertyButtonStyle_in_rulePropertyStyle1097);
+                    this_PropertyButtonStyle_0=rulePropertyButtonStyle();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyHtmlStyleParserRuleCall_1()); 
+                          
+                    }
+                    pushFollow(FOLLOW_rulePropertyHtmlStyle_in_rulePropertyStyle1124);
+                    this_PropertyHtmlStyle_1=rulePropertyHtmlStyle();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyProgressbarStyleParserRuleCall_2()); 
+                          
+                    }
+                    pushFollow(FOLLOW_rulePropertyProgressbarStyle_in_rulePropertyStyle1151);
+                    this_PropertyProgressbarStyle_2=rulePropertyProgressbarStyle();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyTextStyleParserRuleCall_3()); 
+                          
+                    }
+                    pushFollow(FOLLOW_rulePropertyTextStyle_in_rulePropertyStyle1178);
+                    this_PropertyTextStyle_3=rulePropertyTextStyle();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyBooleanStyleParserRuleCall_4()); 
+                          
+                    }
+                    pushFollow(FOLLOW_rulePropertyBooleanStyle_in_rulePropertyStyle1205);
+                    this_PropertyBooleanStyle_4=rulePropertyBooleanStyle();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyDateStyleParserRuleCall_5()); 
+                          
+                    }
+                    pushFollow(FOLLOW_rulePropertyDateStyle_in_rulePropertyStyle1232);
+                    this_PropertyDateStyle_5=rulePropertyDateStyle();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyNumberStyleParserRuleCall_6()); 
+                          
+                    }
+                    pushFollow(FOLLOW_rulePropertyNumberStyle_in_rulePropertyStyle1259);
+                    this_PropertyNumberStyle_6=rulePropertyNumberStyle();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyImageStyleParserRuleCall_7()); 
+                          
+                    }
+                    pushFollow(FOLLOW_rulePropertyImageStyle_in_rulePropertyStyle1286);
+                    this_PropertyImageStyle_7=rulePropertyImageStyle();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyQuantityStyleParserRuleCall_8()); 
+                          
+                    }
+                    pushFollow(FOLLOW_rulePropertyQuantityStyle_in_rulePropertyStyle1313);
+                    this_PropertyQuantityStyle_8=rulePropertyQuantityStyle();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getPropertyPriceStyleParserRuleCall_9()); 
+                          
+                    }
+                    pushFollow(FOLLOW_rulePropertyPriceStyle_in_rulePropertyStyle1340);
+                    this_PropertyPriceStyle_9=rulePropertyPriceStyle();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getPropertyStyleAccess().getGridPropIndicatorStyleParserRuleCall_10()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleGridPropIndicatorStyle_in_rulePropertyStyle1367);
+                    this_GridPropIndicatorStyle_10=ruleGridPropIndicatorStyle();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_GridPropIndicatorStyle_10; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePropertyStyle"
+
+
+    // $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 ;
+    public final EObject entryRulePropertyButtonStyle() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePropertyButtonStyle = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPropertyButtonStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyButtonStyle_in_entryRulePropertyButtonStyle1402);
+            iv_rulePropertyButtonStyle=rulePropertyButtonStyle();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePropertyButtonStyle; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyButtonStyle1412); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePropertyButtonStyle"
+
+
+    // $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 ) ) ) ;
+    public final EObject rulePropertyButtonStyle() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token lv_eventTopic_3_0=null;
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getPropertyButtonStyleAccess().getCxGridPropButtonStyleAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,27,FOLLOW_27_in_rulePropertyButtonStyle1458); 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()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getPropertyButtonStyleRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"eventTopic",
+                      		lv_eventTopic_3_0, 
+                      		"STRING");
+              	    
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePropertyButtonStyle"
+
+
+    // $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 ;
+    public final EObject entryRulePropertyHtmlStyle() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePropertyHtmlStyle = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPropertyHtmlStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyHtmlStyle_in_entryRulePropertyHtmlStyle1528);
+            iv_rulePropertyHtmlStyle=rulePropertyHtmlStyle();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePropertyHtmlStyle; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyHtmlStyle1538); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePropertyHtmlStyle"
+
+
+    // $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' ) ;
+    public final EObject rulePropertyHtmlStyle() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+         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' )
+            {
+            // ../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'
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getPropertyHtmlStyleAccess().getCxGridPropHtmlStyleAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,29,FOLLOW_29_in_rulePropertyHtmlStyle1584); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getPropertyHtmlStyleAccess().getHtmlStyleKeyword_1());
+                  
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePropertyHtmlStyle"
+
+
+    // $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 ;
+    public final EObject entryRulePropertyBooleanStyle() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePropertyBooleanStyle = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPropertyBooleanStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyBooleanStyle_in_entryRulePropertyBooleanStyle1620);
+            iv_rulePropertyBooleanStyle=rulePropertyBooleanStyle();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePropertyBooleanStyle; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyBooleanStyle1630); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePropertyBooleanStyle"
+
+
+    // $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' ) ;
+    public final EObject rulePropertyBooleanStyle() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+         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' )
+            {
+            // ../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'
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getPropertyBooleanStyleAccess().getCxGridPropBooleanStyleAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,30,FOLLOW_30_in_rulePropertyBooleanStyle1676); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getPropertyBooleanStyleAccess().getBoolStyleKeyword_1());
+                  
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePropertyBooleanStyle"
+
+
+    // $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 ;
+    public final EObject entryRulePropertyDateStyle() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePropertyDateStyle = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPropertyDateStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyDateStyle_in_entryRulePropertyDateStyle1712);
+            iv_rulePropertyDateStyle=rulePropertyDateStyle();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePropertyDateStyle; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyDateStyle1722); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePropertyDateStyle"
+
+
+    // $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 ) ) ) ;
+    public final EObject rulePropertyDateStyle() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token lv_dateFormat_3_0=null;
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getPropertyDateStyleAccess().getCxGridPropDateStyleAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,31,FOLLOW_31_in_rulePropertyDateStyle1768); 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()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getPropertyDateStyleRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"dateFormat",
+                      		lv_dateFormat_3_0, 
+                      		"STRING");
+              	    
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePropertyDateStyle"
+
+
+    // $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 ;
+    public final EObject entryRulePropertyNumberStyle() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePropertyNumberStyle = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPropertyNumberStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyNumberStyle_in_entryRulePropertyNumberStyle1838);
+            iv_rulePropertyNumberStyle=rulePropertyNumberStyle();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePropertyNumberStyle; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyNumberStyle1848); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePropertyNumberStyle"
+
+
+    // $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 ) ) ) ;
+    public final EObject rulePropertyNumberStyle() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token lv_numberFormat_3_0=null;
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getPropertyNumberStyleAccess().getCxGridPropNumberStyleAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,33,FOLLOW_33_in_rulePropertyNumberStyle1894); 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()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getPropertyNumberStyleRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"numberFormat",
+                      		lv_numberFormat_3_0, 
+                      		"STRING");
+              	    
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePropertyNumberStyle"
+
+
+    // $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 ;
+    public final EObject entryRulePropertyProgressbarStyle() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePropertyProgressbarStyle = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPropertyProgressbarStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyProgressbarStyle_in_entryRulePropertyProgressbarStyle1964);
+            iv_rulePropertyProgressbarStyle=rulePropertyProgressbarStyle();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePropertyProgressbarStyle; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyProgressbarStyle1974); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePropertyProgressbarStyle"
+
+
+    // $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 ) ) ) ;
+    public final EObject rulePropertyProgressbarStyle() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        AntlrDatatypeRuleToken lv_maxValue_3_0 = null;
+
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getPropertyProgressbarStyleAccess().getCxGridPropProgressbarStyleAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,34,FOLLOW_34_in_rulePropertyProgressbarStyle2020); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getPropertyProgressbarStyleAccess().getProgressbarStyleKeyword_1());
+                  
+            }
+            otherlv_2=(Token)match(input,35,FOLLOW_35_in_rulePropertyProgressbarStyle2032); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueLDoubleParserRuleCall_3_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleLDouble_in_rulePropertyProgressbarStyle2053);
+            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 ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePropertyProgressbarStyle"
+
+
+    // $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 ;
+    public final EObject entryRuleGridPropIndicatorStyle() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleGridPropIndicatorStyle = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getGridPropIndicatorStyleRule()); 
+            }
+            pushFollow(FOLLOW_ruleGridPropIndicatorStyle_in_entryRuleGridPropIndicatorStyle2089);
+            iv_ruleGridPropIndicatorStyle=ruleGridPropIndicatorStyle();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleGridPropIndicatorStyle; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleGridPropIndicatorStyle2099); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleGridPropIndicatorStyle"
+
+
+    // $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 ) ) ) ;
+    public final EObject ruleGridPropIndicatorStyle() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        AntlrDatatypeRuleToken lv_greenStarts_3_0 = null;
+
+        AntlrDatatypeRuleToken lv_redEnds_5_0 = null;
+
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getGridPropIndicatorStyleAccess().getCxGridPropIndicatorStyleAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,36,FOLLOW_36_in_ruleGridPropIndicatorStyle2145); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getGridPropIndicatorStyleAccess().getIndicatorStyleKeyword_1());
+                  
+            }
+            otherlv_2=(Token)match(input,37,FOLLOW_37_in_ruleGridPropIndicatorStyle2157); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getGridPropIndicatorStyleAccess().getGreenStartsLDoubleParserRuleCall_3_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleLDouble_in_ruleGridPropIndicatorStyle2178);
+            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();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_4=(Token)match(input,38,FOLLOW_38_in_ruleGridPropIndicatorStyle2190); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getGridPropIndicatorStyleAccess().getRedEndsLDoubleParserRuleCall_5_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleLDouble_in_ruleGridPropIndicatorStyle2211);
+            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 ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleGridPropIndicatorStyle"
+
+
+    // $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 ;
+    public final EObject entryRulePropertyQuantityStyle() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePropertyQuantityStyle = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPropertyQuantityStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyQuantityStyle_in_entryRulePropertyQuantityStyle2247);
+            iv_rulePropertyQuantityStyle=rulePropertyQuantityStyle();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePropertyQuantityStyle; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyQuantityStyle2257); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePropertyQuantityStyle"
+
+
+    // $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 ) ) ) ;
+    public final EObject rulePropertyQuantityStyle() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_htmlPattern_2_0=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        Token lv_valueNumberFormat_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token otherlv_11=null;
+        EObject lv_valuePropertyPath_5_0 = null;
+
+        EObject lv_uomPropertyPath_12_0 = null;
+
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getPropertyQuantityStyleAccess().getCxGridPropQuantityStyleAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,39,FOLLOW_39_in_rulePropertyQuantityStyle2303); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 ) )?
+            int alt7=2;
+            int LA7_0 = input.LA(1);
+
+            if ( (LA7_0==RULE_STRING) ) {
+                alt7=1;
+            }
+            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 )
+                    {
+                    // ../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
+                    {
+                    lv_htmlPattern_2_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rulePropertyQuantityStyle2320); if (state.failed) return current;
+                    if ( state.backtracking==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");
+                      	    
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_3=(Token)match(input,40,FOLLOW_40_in_rulePropertyQuantityStyle2338); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getPropertyQuantityStyleAccess().getValueKeyword_3());
+                  
+            }
+            otherlv_4=(Token)match(input,22,FOLLOW_22_in_rulePropertyQuantityStyle2350); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getPropertyQuantityStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleNestedField_in_rulePropertyQuantityStyle2371);
+            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();
+              	    
+            }
+
+            }
+
+
+            }
+
+            // ../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= ')' )?
+            int alt8=2;
+            int LA8_0 = input.LA(1);
+
+            if ( (LA8_0==41) ) {
+                alt8=1;
+            }
+            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= ')'
+                    {
+                    otherlv_6=(Token)match(input,41,FOLLOW_41_in_rulePropertyQuantityStyle2384); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_6, grammarAccess.getPropertyQuantityStyleAccess().getLeftParenthesisKeyword_6_0());
+                          
+                    }
+                    otherlv_7=(Token)match(input,32,FOLLOW_32_in_rulePropertyQuantityStyle2396); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	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 )
+                    {
+                    // ../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
+                    {
+                    lv_valueNumberFormat_8_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rulePropertyQuantityStyle2413); if (state.failed) return current;
+                    if ( state.backtracking==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");
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_9=(Token)match(input,42,FOLLOW_42_in_rulePropertyQuantityStyle2430); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_9, grammarAccess.getPropertyQuantityStyleAccess().getRightParenthesisKeyword_6_3());
+                          
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_10=(Token)match(input,43,FOLLOW_43_in_rulePropertyQuantityStyle2444); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_10, grammarAccess.getPropertyQuantityStyleAccess().getUomKeyword_7());
+                  
+            }
+            otherlv_11=(Token)match(input,22,FOLLOW_22_in_rulePropertyQuantityStyle2456); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getPropertyQuantityStyleAccess().getUomPropertyPathNestedFieldParserRuleCall_9_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleNestedField_in_rulePropertyQuantityStyle2477);
+            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 ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePropertyQuantityStyle"
+
+
+    // $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 ;
+    public final EObject entryRulePropertyPriceStyle() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePropertyPriceStyle = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPropertyPriceStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyPriceStyle_in_entryRulePropertyPriceStyle2513);
+            iv_rulePropertyPriceStyle=rulePropertyPriceStyle();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePropertyPriceStyle; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyPriceStyle2523); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePropertyPriceStyle"
+
+
+    // $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 ) ) ) ;
+    public final EObject rulePropertyPriceStyle() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_htmlPattern_2_0=null;
+        Token otherlv_3=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        Token otherlv_7=null;
+        Token lv_valueNumberFormat_8_0=null;
+        Token otherlv_9=null;
+        Token otherlv_10=null;
+        Token otherlv_11=null;
+        EObject lv_valuePropertyPath_5_0 = null;
+
+        EObject lv_currencyPropertyPath_12_0 = null;
+
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getPropertyPriceStyleAccess().getCxGridPropPriceStyleAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,44,FOLLOW_44_in_rulePropertyPriceStyle2569); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 ) )?
+            int alt9=2;
+            int LA9_0 = input.LA(1);
+
+            if ( (LA9_0==RULE_STRING) ) {
+                alt9=1;
+            }
+            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 )
+                    {
+                    // ../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
+                    {
+                    lv_htmlPattern_2_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rulePropertyPriceStyle2586); if (state.failed) return current;
+                    if ( state.backtracking==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");
+                      	    
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_3=(Token)match(input,40,FOLLOW_40_in_rulePropertyPriceStyle2604); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_3, grammarAccess.getPropertyPriceStyleAccess().getValueKeyword_3());
+                  
+            }
+            otherlv_4=(Token)match(input,22,FOLLOW_22_in_rulePropertyPriceStyle2616); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getPropertyPriceStyleAccess().getValuePropertyPathNestedFieldParserRuleCall_5_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleNestedField_in_rulePropertyPriceStyle2637);
+            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();
+              	    
+            }
+
+            }
+
+
+            }
+
+            // ../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= ')' )?
+            int alt10=2;
+            int LA10_0 = input.LA(1);
+
+            if ( (LA10_0==41) ) {
+                alt10=1;
+            }
+            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= ')'
+                    {
+                    otherlv_6=(Token)match(input,41,FOLLOW_41_in_rulePropertyPriceStyle2650); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_6, grammarAccess.getPropertyPriceStyleAccess().getLeftParenthesisKeyword_6_0());
+                          
+                    }
+                    otherlv_7=(Token)match(input,32,FOLLOW_32_in_rulePropertyPriceStyle2662); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	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 )
+                    {
+                    // ../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
+                    {
+                    lv_valueNumberFormat_8_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rulePropertyPriceStyle2679); if (state.failed) return current;
+                    if ( state.backtracking==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");
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_9=(Token)match(input,42,FOLLOW_42_in_rulePropertyPriceStyle2696); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_9, grammarAccess.getPropertyPriceStyleAccess().getRightParenthesisKeyword_6_3());
+                          
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_10=(Token)match(input,45,FOLLOW_45_in_rulePropertyPriceStyle2710); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_10, grammarAccess.getPropertyPriceStyleAccess().getCurrencyKeyword_7());
+                  
+            }
+            otherlv_11=(Token)match(input,22,FOLLOW_22_in_rulePropertyPriceStyle2722); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getPropertyPriceStyleAccess().getCurrencyPropertyPathNestedFieldParserRuleCall_9_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleNestedField_in_rulePropertyPriceStyle2743);
+            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 ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePropertyPriceStyle"
+
+
+    // $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 ;
+    public final EObject entryRulePropertyTextStyle() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePropertyTextStyle = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPropertyTextStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyTextStyle_in_entryRulePropertyTextStyle2779);
+            iv_rulePropertyTextStyle=rulePropertyTextStyle();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePropertyTextStyle; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyTextStyle2789); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePropertyTextStyle"
+
+
+    // $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' ) ;
+    public final EObject rulePropertyTextStyle() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+         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' )
+            {
+            // ../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'
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getPropertyTextStyleAccess().getCxGridPropTextStyleAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,46,FOLLOW_46_in_rulePropertyTextStyle2835); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_1, grammarAccess.getPropertyTextStyleAccess().getTextStyleKeyword_1());
+                  
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePropertyTextStyle"
+
+
+    // $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 ;
+    public final EObject entryRulePropertyImageStyle() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_rulePropertyImageStyle = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getPropertyImageStyleRule()); 
+            }
+            pushFollow(FOLLOW_rulePropertyImageStyle_in_entryRulePropertyImageStyle2871);
+            iv_rulePropertyImageStyle=rulePropertyImageStyle();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_rulePropertyImageStyle; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRulePropertyImageStyle2881); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRulePropertyImageStyle"
+
+
+    // $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= '}' ) ;
+    public final EObject rulePropertyImageStyle() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token lv_eventTopic_3_0=null;
+        Token otherlv_4=null;
+        Token otherlv_6=null;
+        EObject lv_configs_5_0 = null;
+
+
+         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= '}' )
+            {
+            // ../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= '}'
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getPropertyImageStyleAccess().getCxGridPropImageStyleAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,47,FOLLOW_47_in_rulePropertyImageStyle2927); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 ) ) )?
+            int alt11=2;
+            int LA11_0 = input.LA(1);
+
+            if ( (LA11_0==28) ) {
+                alt11=1;
+            }
+            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 ) )
+                    {
+                    otherlv_2=(Token)match(input,28,FOLLOW_28_in_rulePropertyImageStyle2940); if (state.failed) return current;
+                    if ( state.backtracking==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 )
+                    {
+                    // ../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
+                    {
+                    lv_eventTopic_3_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_rulePropertyImageStyle2957); if (state.failed) return current;
+                    if ( state.backtracking==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");
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            otherlv_4=(Token)match(input,15,FOLLOW_15_in_rulePropertyImageStyle2976); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 ) )*
+            loop12:
+            do {
+                int alt12=2;
+                int LA12_0 = input.LA(1);
+
+                if ( (LA12_0==48||LA12_0==50) ) {
+                    alt12=1;
+                }
+
+
+                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 )
+            	    {
+            	    // ../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
+            	    {
+            	    if ( state.backtracking==0 ) {
+            	       
+            	      	        newCompositeNode(grammarAccess.getPropertyImageStyleAccess().getConfigsStyleConfigParserRuleCall_4_0()); 
+            	      	    
+            	    }
+            	    pushFollow(FOLLOW_ruleStyleConfig_in_rulePropertyImageStyle2997);
+            	    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();
+            	      	    
+            	    }
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop12;
+                }
+            } while (true);
+
+            otherlv_6=(Token)match(input,17,FOLLOW_17_in_rulePropertyImageStyle3010); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	newLeafNode(otherlv_6, grammarAccess.getPropertyImageStyleAccess().getRightCurlyBracketKeyword_5());
+                  
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "rulePropertyImageStyle"
+
+
+    // $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 ;
+    public final String entryRuleQualifiedName() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleQualifiedName = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getQualifiedNameRule()); 
+            }
+            pushFollow(FOLLOW_ruleQualifiedName_in_entryRuleQualifiedName3047);
+            iv_ruleQualifiedName=ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleQualifiedName.getText(); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedName3058); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleQualifiedName"
+
+
+    // $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 )* ) ;
+    public final AntlrDatatypeRuleToken ruleQualifiedName() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        AntlrDatatypeRuleToken this_ValidID_0 = null;
+
+        AntlrDatatypeRuleToken this_ValidID_2 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../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 )* )
+            {
+            // ../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 )*
+            {
+            if ( state.backtracking==0 ) {
+               
+                      newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); 
+                  
+            }
+            pushFollow(FOLLOW_ruleValidID_in_ruleQualifiedName3105);
+            this_ValidID_0=ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(this_ValidID_0);
+                  
+            }
+            if ( state.backtracking==0 ) {
+               
+                      afterParserOrEnumRuleCall();
+                  
+            }
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1411:1: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
+            loop13:
+            do {
+                int alt13=2;
+                int LA13_0 = input.LA(1);
+
+                if ( (LA13_0==26) ) {
+                    int LA13_2 = input.LA(2);
+
+                    if ( (LA13_2==RULE_ID) && (synpred1_InternalGridSource())) {
+                        alt13=1;
+                    }
+
+
+                }
+
+
+                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
+            	    {
+            	    // ../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= '.'
+            	    {
+            	    kw=(Token)match(input,26,FOLLOW_26_in_ruleQualifiedName3133); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	              current.merge(kw);
+            	              newLeafNode(kw, grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); 
+            	          
+            	    }
+
+            	    }
+
+            	    if ( state.backtracking==0 ) {
+            	       
+            	              newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); 
+            	          
+            	    }
+            	    pushFollow(FOLLOW_ruleValidID_in_ruleQualifiedName3156);
+            	    this_ValidID_2=ruleValidID();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      		current.merge(this_ValidID_2);
+            	          
+            	    }
+            	    if ( state.backtracking==0 ) {
+            	       
+            	              afterParserOrEnumRuleCall();
+            	          
+            	    }
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop13;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleQualifiedName"
+
+
+    // $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 ;
+    public final String entryRuleValidID() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleValidID = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getValidIDRule()); 
+            }
+            pushFollow(FOLLOW_ruleValidID_in_entryRuleValidID3204);
+            iv_ruleValidID=ruleValidID();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleValidID.getText(); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleValidID3215); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleValidID"
+
+
+    // $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 ;
+    public final AntlrDatatypeRuleToken ruleValidID() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token this_ID_0=null;
+
+         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
+            {
+            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleValidID3254); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(this_ID_0);
+                  
+            }
+            if ( state.backtracking==0 ) {
+               
+                  newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
+                  
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleValidID"
+
+
+    // $ANTLR start "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 ;
+    public final EObject entryRuleStyleConfig() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStyleConfig = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStyleConfigRule()); 
+            }
+            pushFollow(FOLLOW_ruleStyleConfig_in_entryRuleStyleConfig3298);
+            iv_ruleStyleConfig=ruleStyleConfig();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStyleConfig; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStyleConfig3308); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStyleConfig"
+
+
+    // $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 ) ;
+    public final EObject ruleStyleConfig() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_NumericToResourceStyleConfig_0 = null;
+
+        EObject this_StringToResourceStyleConfig_1 = null;
+
+
+         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 )
+            {
+            // ../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 )
+            int alt14=2;
+            int LA14_0 = input.LA(1);
+
+            if ( (LA14_0==48) ) {
+                alt14=1;
+            }
+            else if ( (LA14_0==50) ) {
+                alt14=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 14, 0, input);
+
+                throw nvae;
+            }
+            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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStyleConfigAccess().getNumericToResourceStyleConfigParserRuleCall_0()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleNumericToResourceStyleConfig_in_ruleStyleConfig3355);
+                    this_NumericToResourceStyleConfig_0=ruleNumericToResourceStyleConfig();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getStyleConfigAccess().getStringToResourceStyleConfigParserRuleCall_1()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleStringToResourceStyleConfig_in_ruleStyleConfig3382);
+                    this_StringToResourceStyleConfig_1=ruleStringToResourceStyleConfig();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_StringToResourceStyleConfig_1; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStyleConfig"
+
+
+    // $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 ;
+    public final EObject entryRuleNumericToResourceStyleConfig() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleNumericToResourceStyleConfig = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getNumericToResourceStyleConfigRule()); 
+            }
+            pushFollow(FOLLOW_ruleNumericToResourceStyleConfig_in_entryRuleNumericToResourceStyleConfig3417);
+            iv_ruleNumericToResourceStyleConfig=ruleNumericToResourceStyleConfig();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleNumericToResourceStyleConfig; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleNumericToResourceStyleConfig3427); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleNumericToResourceStyleConfig"
+
+
+    // $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 ) ) ) ;
+    public final EObject ruleNumericToResourceStyleConfig() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_3=null;
+        Token lv_resourceThemePath_4_0=null;
+        Enumerator lv_compare_1_0 = null;
+
+        AntlrDatatypeRuleToken lv_value_2_0 = null;
+
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            otherlv_0=(Token)match(input,48,FOLLOW_48_in_ruleNumericToResourceStyleConfig3464); if (state.failed) return current;
+            if ( state.backtracking==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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getNumericToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStyleCompare_in_ruleNumericToResourceStyleConfig3485);
+            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();
+              	    
+            }
+
+            }
+
+
+            }
+
+            // ../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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getNumericToResourceStyleConfigAccess().getValueLDoubleParserRuleCall_2_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleLDouble_in_ruleNumericToResourceStyleConfig3506);
+            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();
+              	    
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,49,FOLLOW_49_in_ruleNumericToResourceStyleConfig3518); 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()); 
+              		
+            }
+            if ( state.backtracking==0 ) {
+
+              	        if (current==null) {
+              	            current = createModelElement(grammarAccess.getNumericToResourceStyleConfigRule());
+              	        }
+                     		setWithLastConsumed(
+                     			current, 
+                     			"resourceThemePath",
+                      		lv_resourceThemePath_4_0, 
+                      		"THEME_RESOURCE");
+              	    
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleNumericToResourceStyleConfig"
+
+
+    // $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 ;
+    public final EObject entryRuleStringToResourceStyleConfig() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleStringToResourceStyleConfig = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getStringToResourceStyleConfigRule()); 
+            }
+            pushFollow(FOLLOW_ruleStringToResourceStyleConfig_in_entryRuleStringToResourceStyleConfig3576);
+            iv_ruleStringToResourceStyleConfig=ruleStringToResourceStyleConfig();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleStringToResourceStyleConfig; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleStringToResourceStyleConfig3586); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleStringToResourceStyleConfig"
+
+
+    // $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 ) ) ) ;
+    public final EObject ruleStringToResourceStyleConfig() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_value_2_0=null;
+        Token otherlv_3=null;
+        Token lv_resourceThemePath_4_0=null;
+        Enumerator lv_compare_1_0 = null;
+
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            otherlv_0=(Token)match(input,50,FOLLOW_50_in_ruleStringToResourceStyleConfig3623); if (state.failed) return current;
+            if ( state.backtracking==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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getStringToResourceStyleConfigAccess().getCompareStyleCompareEnumRuleCall_1_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleStyleCompare_in_ruleStringToResourceStyleConfig3644);
+            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();
+              	    
+            }
+
+            }
+
+
+            }
+
+            // ../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 )
+            {
+            // ../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
+            {
+            lv_value_2_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleStringToResourceStyleConfig3661); if (state.failed) return current;
+            if ( state.backtracking==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, 
+                      		"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 )
+            {
+            // ../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
+            {
+            lv_resourceThemePath_4_0=(Token)match(input,RULE_THEME_RESOURCE,FOLLOW_RULE_THEME_RESOURCE_in_ruleStringToResourceStyleConfig3695); if (state.failed) return current;
+            if ( state.backtracking==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 ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStringToResourceStyleConfig"
+
+
+    // $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 ;
+    public final String entryRuleLInt() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleLInt = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLIntRule()); 
+            }
+            pushFollow(FOLLOW_ruleLInt_in_entryRuleLInt3737);
+            iv_ruleLInt=ruleLInt();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLInt.getText(); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleLInt3748); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLInt"
+
+
+    // $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 ) ;
+    public final AntlrDatatypeRuleToken ruleLInt() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        Token this_INT_2=null;
+
+         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 )
+            {
+            // ../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
+            {
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1685:2: (kw= '+' | kw= '-' )?
+            int alt15=3;
+            int LA15_0 = input.LA(1);
+
+            if ( (LA15_0==51) ) {
+                alt15=1;
+            }
+            else if ( (LA15_0==52) ) {
+                alt15=2;
+            }
+            switch (alt15) {
+                case 1 :
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:1686:2: kw= '+'
+                    {
+                    kw=(Token)match(input,51,FOLLOW_51_in_ruleLInt3787); if (state.failed) return current;
+                    if ( state.backtracking==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= '-'
+                    {
+                    kw=(Token)match(input,52,FOLLOW_52_in_ruleLInt3806); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                              current.merge(kw);
+                              newLeafNode(kw, grammarAccess.getLIntAccess().getHyphenMinusKeyword_0_1()); 
+                          
+                    }
+
+                    }
+                    break;
+
+            }
+
+            this_INT_2=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleLInt3823); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(this_INT_2);
+                  
+            }
+            if ( state.backtracking==0 ) {
+               
+                  newLeafNode(this_INT_2, grammarAccess.getLIntAccess().getINTTerminalRuleCall_1()); 
+                  
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLInt"
+
+
+    // $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 ;
+    public final String entryRuleLDouble() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleLDouble = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getLDoubleRule()); 
+            }
+            pushFollow(FOLLOW_ruleLDouble_in_entryRuleLDouble3869);
+            iv_ruleLDouble=ruleLDouble();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleLDouble.getText(); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleLDouble3880); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleLDouble"
+
+
+    // $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 )? ) ;
+    public final AntlrDatatypeRuleToken ruleLDouble() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        Token this_INT_2=null;
+        AntlrDatatypeRuleToken this_LInt_0 = null;
+
+
+         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 )? )
+            {
+            // ../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 )?
+            {
+            if ( state.backtracking==0 ) {
+               
+                      newCompositeNode(grammarAccess.getLDoubleAccess().getLIntParserRuleCall_0()); 
+                  
+            }
+            pushFollow(FOLLOW_ruleLInt_in_ruleLDouble3927);
+            this_LInt_0=ruleLInt();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(this_LInt_0);
+                  
+            }
+            if ( state.backtracking==0 ) {
+               
+                      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 )?
+            int alt16=2;
+            int LA16_0 = input.LA(1);
+
+            if ( (LA16_0==26) ) {
+                alt16=1;
+            }
+            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
+                    {
+                    kw=(Token)match(input,26,FOLLOW_26_in_ruleLDouble3946); if (state.failed) return current;
+                    if ( state.backtracking==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;
+                    if ( state.backtracking==0 ) {
+
+                      		current.merge(this_INT_2);
+                          
+                    }
+                    if ( state.backtracking==0 ) {
+                       
+                          newLeafNode(this_INT_2, grammarAccess.getLDoubleAccess().getINTTerminalRuleCall_1_1()); 
+                          
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleLDouble"
+
+
+    // $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 ;
+    public final EObject entryRuleJvmTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmTypeReference = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmTypeReference_in_entryRuleJvmTypeReference4008);
+            iv_ruleJvmTypeReference=ruleJvmTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmTypeReference; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmTypeReference4018); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmTypeReference"
+
+
+    // $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 ) ;
+    public final EObject ruleJvmTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_JvmParameterizedTypeReference_0 = null;
+
+        EObject this_XFunctionTypeRef_3 = null;
+
+
+         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 )
+            {
+            // ../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 )
+            int alt18=2;
+            int LA18_0 = input.LA(1);
+
+            if ( (LA18_0==RULE_ID) ) {
+                alt18=1;
+            }
+            else if ( (LA18_0==41||LA18_0==56) ) {
+                alt18=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 18, 0, input);
+
+                throw nvae;
+            }
+            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 ) )* )
+                    {
+                    // ../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 ) )*
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleJvmParameterizedTypeReference_in_ruleJvmTypeReference4066);
+                    this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              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 ) )*
+                    loop17:
+                    do {
+                        int alt17=2;
+                        int LA17_0 = input.LA(1);
+
+                        if ( (LA17_0==53) && (synpred2_InternalGridSource())) {
+                            alt17=1;
+                        }
+
+
+                        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 )
+                    	    {
+                    	    // ../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
+                    	    {
+                    	    // ../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: 
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	              current = forceCreateModelElementAndSet(
+                    	                  grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0(),
+                    	                  current);
+                    	          
+                    	    }
+
+                    	    }
+
+                    	    if ( state.backtracking==0 ) {
+                    	       
+                    	              newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1()); 
+                    	          
+                    	    }
+                    	    pushFollow(FOLLOW_ruleArrayBrackets_in_ruleJvmTypeReference4102);
+                    	    ruleArrayBrackets();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+                    	       
+                    	              afterParserOrEnumRuleCall();
+                    	          
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop17;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleXFunctionTypeRef_in_ruleJvmTypeReference4133);
+                    this_XFunctionTypeRef_3=ruleXFunctionTypeRef();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_XFunctionTypeRef_3; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmTypeReference"
+
+
+    // $ANTLR start "entryRuleArrayBrackets"
+    // ../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 ;
+    public final String entryRuleArrayBrackets() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleArrayBrackets = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getArrayBracketsRule()); 
+            }
+            pushFollow(FOLLOW_ruleArrayBrackets_in_entryRuleArrayBrackets4169);
+            iv_ruleArrayBrackets=ruleArrayBrackets();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleArrayBrackets.getText(); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleArrayBrackets4180); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleArrayBrackets"
+
+
+    // $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= ']' ) ;
+    public final AntlrDatatypeRuleToken ruleArrayBrackets() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+
+         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= ']' )
+            {
+            // ../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= ']'
+            {
+            kw=(Token)match(input,53,FOLLOW_53_in_ruleArrayBrackets4218); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                      current.merge(kw);
+                      newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0()); 
+                  
+            }
+            kw=(Token)match(input,54,FOLLOW_54_in_ruleArrayBrackets4231); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                      current.merge(kw);
+                      newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1()); 
+                  
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleArrayBrackets"
+
+
+    // $ANTLR start "entryRuleXFunctionTypeRef"
+    // ../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 ;
+    public final EObject entryRuleXFunctionTypeRef() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXFunctionTypeRef = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXFunctionTypeRefRule()); 
+            }
+            pushFollow(FOLLOW_ruleXFunctionTypeRef_in_entryRuleXFunctionTypeRef4271);
+            iv_ruleXFunctionTypeRef=ruleXFunctionTypeRef();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXFunctionTypeRef; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleXFunctionTypeRef4281); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXFunctionTypeRef"
+
+
+    // $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 ) ) ) ;
+    public final EObject ruleXFunctionTypeRef() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token otherlv_2=null;
+        Token otherlv_4=null;
+        Token otherlv_5=null;
+        EObject lv_paramTypes_1_0 = null;
+
+        EObject lv_paramTypes_3_0 = null;
+
+        EObject lv_returnType_6_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../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 ) ) )
+            {
+            // ../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 ) )
+            {
+            // ../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= ')' )?
+            int alt21=2;
+            int LA21_0 = input.LA(1);
+
+            if ( (LA21_0==41) ) {
+                alt21=1;
+            }
+            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= ')'
+                    {
+                    otherlv_0=(Token)match(input,41,FOLLOW_41_in_ruleXFunctionTypeRef4319); if (state.failed) return current;
+                    if ( state.backtracking==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 ) ) )* )?
+                    int alt20=2;
+                    int LA20_0 = input.LA(1);
+
+                    if ( (LA20_0==RULE_ID||LA20_0==41||LA20_0==56) ) {
+                        alt20=1;
+                    }
+                    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 ) ) )*
+                            {
+                            // ../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 )
+                            {
+                            // ../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
+                            {
+                            if ( state.backtracking==0 ) {
+                               
+                              	        newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0()); 
+                              	    
+                            }
+                            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleXFunctionTypeRef4341);
+                            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();
+                              	    
+                            }
+
+                            }
+
+
+                            }
+
+                            // ../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 ) ) )*
+                            loop19:
+                            do {
+                                int alt19=2;
+                                int LA19_0 = input.LA(1);
+
+                                if ( (LA19_0==55) ) {
+                                    alt19=1;
+                                }
+
+
+                                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 ) )
+                            	    {
+                            	    otherlv_2=(Token)match(input,55,FOLLOW_55_in_ruleXFunctionTypeRef4354); if (state.failed) return current;
+                            	    if ( state.backtracking==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 )
+                            	    {
+                            	    // ../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
+                            	    {
+                            	    if ( state.backtracking==0 ) {
+                            	       
+                            	      	        newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0()); 
+                            	      	    
+                            	    }
+                            	    pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleXFunctionTypeRef4375);
+                            	    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();
+                            	      	    
+                            	    }
+
+                            	    }
+
+
+                            	    }
+
+
+                            	    }
+                            	    break;
+
+                            	default :
+                            	    break loop19;
+                                }
+                            } while (true);
+
+
+                            }
+                            break;
+
+                    }
+
+                    otherlv_4=(Token)match(input,42,FOLLOW_42_in_ruleXFunctionTypeRef4391); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
+                          
+                    }
+
+                    }
+                    break;
+
+            }
+
+            otherlv_5=(Token)match(input,56,FOLLOW_56_in_ruleXFunctionTypeRef4405); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleXFunctionTypeRef4426);
+            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 ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXFunctionTypeRef"
+
+
+    // $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 ;
+    public final EObject entryRuleJvmParameterizedTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmParameterizedTypeReference = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmParameterizedTypeReference_in_entryRuleJvmParameterizedTypeReference4462);
+            iv_ruleJvmParameterizedTypeReference=ruleJvmParameterizedTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmParameterizedTypeReference; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmParameterizedTypeReference4472); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmParameterizedTypeReference"
+
+
+    // $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= '>' )? )* )? ) ;
+    public final EObject ruleJvmParameterizedTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_3=null;
+        Token otherlv_5=null;
+        Token otherlv_7=null;
+        Token otherlv_9=null;
+        Token otherlv_11=null;
+        Token otherlv_13=null;
+        EObject lv_arguments_2_0 = null;
+
+        EObject lv_arguments_4_0 = null;
+
+        EObject lv_arguments_10_0 = null;
+
+        EObject lv_arguments_12_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../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= '>' )? )* )? )
+            {
+            // ../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= '>' )? )* )?
+            {
+            // ../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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+
+              			if (current==null) {
+              	            current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
+              	        }
+                      
+            }
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleQualifiedName_in_ruleJvmParameterizedTypeReference4520);
+            ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               
+              	        afterParserOrEnumRuleCall();
+              	    
+            }
+
+            }
+
+
+            }
+
+            // ../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= '>' )? )* )?
+            int alt26=2;
+            int LA26_0 = input.LA(1);
+
+            if ( (LA26_0==57) && (synpred3_InternalGridSource())) {
+                alt26=1;
+            }
+            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= '>' )? )*
+                    {
+                    // ../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= '<'
+                    {
+                    otherlv_1=(Token)match(input,57,FOLLOW_57_in_ruleJvmParameterizedTypeReference4541); if (state.failed) return current;
+                    if ( state.backtracking==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 )
+                    {
+                    // ../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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_ruleJvmParameterizedTypeReference4563);
+                    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();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    // ../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 ) ) )*
+                    loop22:
+                    do {
+                        int alt22=2;
+                        int LA22_0 = input.LA(1);
+
+                        if ( (LA22_0==55) ) {
+                            alt22=1;
+                        }
+
+
+                        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 ) )
+                    	    {
+                    	    otherlv_3=(Token)match(input,55,FOLLOW_55_in_ruleJvmParameterizedTypeReference4576); if (state.failed) return current;
+                    	    if ( state.backtracking==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 )
+                    	    {
+                    	    // ../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
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+                    	       
+                    	      	        newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); 
+                    	      	    
+                    	    }
+                    	    pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_ruleJvmParameterizedTypeReference4597);
+                    	    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();
+                    	      	    
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop22;
+                        }
+                    } while (true);
+
+                    otherlv_5=(Token)match(input,58,FOLLOW_58_in_ruleJvmParameterizedTypeReference4611); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	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= '>' )? )*
+                    loop25:
+                    do {
+                        int alt25=2;
+                        int LA25_0 = input.LA(1);
+
+                        if ( (LA25_0==26) && (synpred4_InternalGridSource())) {
+                            alt25=1;
+                        }
+
+
+                        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= '>' )?
+                    	    {
+                    	    // ../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= '.' )
+                    	    {
+                    	    // ../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= '.'
+                    	    {
+                    	    // ../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: 
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	              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;
+                    	    if ( state.backtracking==0 ) {
+
+                    	          	newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
+                    	          
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // ../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 )
+                    	    {
+                    	    // ../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
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      			if (current==null) {
+                    	      	            current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
+                    	      	        }
+                    	              
+                    	    }
+                    	    if ( state.backtracking==0 ) {
+                    	       
+                    	      	        newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0()); 
+                    	      	    
+                    	    }
+                    	    pushFollow(FOLLOW_ruleValidID_in_ruleJvmParameterizedTypeReference4672);
+                    	    ruleValidID();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+                    	       
+                    	      	        afterParserOrEnumRuleCall();
+                    	      	    
+                    	    }
+
+                    	    }
+
+
+                    	    }
+
+                    	    // ../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= '>' )?
+                    	    int alt24=2;
+                    	    int LA24_0 = input.LA(1);
+
+                    	    if ( (LA24_0==57) && (synpred5_InternalGridSource())) {
+                    	        alt24=1;
+                    	    }
+                    	    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= '>'
+                    	            {
+                    	            // ../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= '<'
+                    	            {
+                    	            otherlv_9=(Token)match(input,57,FOLLOW_57_in_ruleJvmParameterizedTypeReference4693); if (state.failed) return current;
+                    	            if ( state.backtracking==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 )
+                    	            {
+                    	            // ../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
+                    	            {
+                    	            if ( state.backtracking==0 ) {
+                    	               
+                    	              	        newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0()); 
+                    	              	    
+                    	            }
+                    	            pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_ruleJvmParameterizedTypeReference4715);
+                    	            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();
+                    	              	    
+                    	            }
+
+                    	            }
+
+
+                    	            }
+
+                    	            // ../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 ) ) )*
+                    	            loop23:
+                    	            do {
+                    	                int alt23=2;
+                    	                int LA23_0 = input.LA(1);
+
+                    	                if ( (LA23_0==55) ) {
+                    	                    alt23=1;
+                    	                }
+
+
+                    	                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 ) )
+                    	            	    {
+                    	            	    otherlv_11=(Token)match(input,55,FOLLOW_55_in_ruleJvmParameterizedTypeReference4728); if (state.failed) return current;
+                    	            	    if ( state.backtracking==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 )
+                    	            	    {
+                    	            	    // ../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
+                    	            	    {
+                    	            	    if ( state.backtracking==0 ) {
+                    	            	       
+                    	            	      	        newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0()); 
+                    	            	      	    
+                    	            	    }
+                    	            	    pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_ruleJvmParameterizedTypeReference4749);
+                    	            	    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();
+                    	            	      	    
+                    	            	    }
+
+                    	            	    }
+
+
+                    	            	    }
+
+
+                    	            	    }
+                    	            	    break;
+
+                    	            	default :
+                    	            	    break loop23;
+                    	                }
+                    	            } while (true);
+
+                    	            otherlv_13=(Token)match(input,58,FOLLOW_58_in_ruleJvmParameterizedTypeReference4763); if (state.failed) return current;
+                    	            if ( state.backtracking==0 ) {
+
+                    	                  	newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
+                    	                  
+                    	            }
+
+                    	            }
+                    	            break;
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop25;
+                        }
+                    } while (true);
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmParameterizedTypeReference"
+
+
+    // $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 ;
+    public final EObject entryRuleJvmArgumentTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmArgumentTypeReference = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmArgumentTypeReference_in_entryRuleJvmArgumentTypeReference4805);
+            iv_ruleJvmArgumentTypeReference=ruleJvmArgumentTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmArgumentTypeReference; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmArgumentTypeReference4815); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmArgumentTypeReference"
+
+
+    // $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 ) ;
+    public final EObject ruleJvmArgumentTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_JvmTypeReference_0 = null;
+
+        EObject this_JvmWildcardTypeReference_1 = null;
+
+
+         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 )
+            {
+            // ../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 )
+            int alt27=2;
+            int LA27_0 = input.LA(1);
+
+            if ( (LA27_0==RULE_ID||LA27_0==41||LA27_0==56) ) {
+                alt27=1;
+            }
+            else if ( (LA27_0==59) ) {
+                alt27=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 27, 0, input);
+
+                throw nvae;
+            }
+            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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleJvmArgumentTypeReference4862);
+                    this_JvmTypeReference_0=ruleJvmTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                              newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); 
+                          
+                    }
+                    pushFollow(FOLLOW_ruleJvmWildcardTypeReference_in_ruleJvmArgumentTypeReference4889);
+                    this_JvmWildcardTypeReference_1=ruleJvmWildcardTypeReference();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                              current = this_JvmWildcardTypeReference_1; 
+                              afterParserOrEnumRuleCall();
+                          
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmArgumentTypeReference"
+
+
+    // $ANTLR start "entryRuleJvmWildcardTypeReference"
+    // ../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 ;
+    public final EObject entryRuleJvmWildcardTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmWildcardTypeReference = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmWildcardTypeReference_in_entryRuleJvmWildcardTypeReference4924);
+            iv_ruleJvmWildcardTypeReference=ruleJvmWildcardTypeReference();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmWildcardTypeReference; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmWildcardTypeReference4934); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmWildcardTypeReference"
+
+
+    // $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 ) )* ) )? ) ;
+    public final EObject ruleJvmWildcardTypeReference() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        EObject lv_constraints_2_0 = null;
+
+        EObject lv_constraints_3_0 = null;
+
+        EObject lv_constraints_4_0 = null;
+
+        EObject lv_constraints_5_0 = null;
+
+
+         enterRule(); 
+            
+        try {
+            // ../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 ) )* ) )? )
+            {
+            // ../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 ) )* ) )?
+            {
+            // ../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: 
+            {
+            if ( state.backtracking==0 ) {
+
+                      current = forceCreateModelElement(
+                          grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0(),
+                          current);
+                  
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,59,FOLLOW_59_in_ruleJvmWildcardTypeReference4980); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                  	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 ) )* ) )?
+            int alt30=3;
+            int LA30_0 = input.LA(1);
+
+            if ( (LA30_0==60) ) {
+                alt30=1;
+            }
+            else if ( (LA30_0==62) ) {
+                alt30=2;
+            }
+            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 ) )* )
+                    {
+                    // ../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 ) )*
+                    {
+                    // ../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 )
+                    {
+                    // ../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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleJvmUpperBound_in_ruleJvmWildcardTypeReference5003);
+                    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();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2179:2: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
+                    loop28:
+                    do {
+                        int alt28=2;
+                        int LA28_0 = input.LA(1);
+
+                        if ( (LA28_0==61) ) {
+                            alt28=1;
+                        }
+
+
+                        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 )
+                    	    {
+                    	    // ../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
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+                    	       
+                    	      	        newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0()); 
+                    	      	    
+                    	    }
+                    	    pushFollow(FOLLOW_ruleJvmUpperBoundAnded_in_ruleJvmWildcardTypeReference5024);
+                    	    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();
+                    	      	    
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop28;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    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 ) )* )
+                    {
+                    // ../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 ) )*
+                    {
+                    // ../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 )
+                    {
+                    // ../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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleJvmLowerBound_in_ruleJvmWildcardTypeReference5054);
+                    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();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2216:2: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
+                    loop29:
+                    do {
+                        int alt29=2;
+                        int LA29_0 = input.LA(1);
+
+                        if ( (LA29_0==61) ) {
+                            alt29=1;
+                        }
+
+
+                        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 )
+                    	    {
+                    	    // ../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
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+                    	       
+                    	      	        newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0()); 
+                    	      	    
+                    	    }
+                    	    pushFollow(FOLLOW_ruleJvmLowerBoundAnded_in_ruleJvmWildcardTypeReference5075);
+                    	    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();
+                    	      	    
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop29;
+                        }
+                    } while (true);
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmWildcardTypeReference"
+
+
+    // $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 ;
+    public final EObject entryRuleJvmUpperBound() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmUpperBound = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmUpperBoundRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmUpperBound_in_entryRuleJvmUpperBound5115);
+            iv_ruleJvmUpperBound=ruleJvmUpperBound();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmUpperBound; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmUpperBound5125); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmUpperBound"
+
+
+    // $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 ) ) ) ;
+    public final EObject ruleJvmUpperBound() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        EObject lv_typeReference_1_0 = null;
+
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            otherlv_0=(Token)match(input,60,FOLLOW_60_in_ruleJvmUpperBound5162); if (state.failed) return current;
+            if ( state.backtracking==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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleJvmUpperBound5183);
+            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 ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmUpperBound"
+
+
+    // $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 ;
+    public final EObject entryRuleJvmUpperBoundAnded() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmUpperBoundAnded = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmUpperBoundAndedRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmUpperBoundAnded_in_entryRuleJvmUpperBoundAnded5219);
+            iv_ruleJvmUpperBoundAnded=ruleJvmUpperBoundAnded();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmUpperBoundAnded; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmUpperBoundAnded5229); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmUpperBoundAnded"
+
+
+    // $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 ) ) ) ;
+    public final EObject ruleJvmUpperBoundAnded() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        EObject lv_typeReference_1_0 = null;
+
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            otherlv_0=(Token)match(input,61,FOLLOW_61_in_ruleJvmUpperBoundAnded5266); if (state.failed) return current;
+            if ( state.backtracking==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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleJvmUpperBoundAnded5287);
+            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 ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmUpperBoundAnded"
+
+
+    // $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 ;
+    public final EObject entryRuleJvmLowerBound() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmLowerBound = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmLowerBoundRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmLowerBound_in_entryRuleJvmLowerBound5323);
+            iv_ruleJvmLowerBound=ruleJvmLowerBound();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmLowerBound; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmLowerBound5333); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmLowerBound"
+
+
+    // $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 ) ) ) ;
+    public final EObject ruleJvmLowerBound() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        EObject lv_typeReference_1_0 = null;
+
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            otherlv_0=(Token)match(input,62,FOLLOW_62_in_ruleJvmLowerBound5370); if (state.failed) return current;
+            if ( state.backtracking==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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleJvmLowerBound5391);
+            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 ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmLowerBound"
+
+
+    // $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 ;
+    public final EObject entryRuleJvmLowerBoundAnded() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleJvmLowerBoundAnded = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getJvmLowerBoundAndedRule()); 
+            }
+            pushFollow(FOLLOW_ruleJvmLowerBoundAnded_in_entryRuleJvmLowerBoundAnded5427);
+            iv_ruleJvmLowerBoundAnded=ruleJvmLowerBoundAnded();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleJvmLowerBoundAnded; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleJvmLowerBoundAnded5437); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleJvmLowerBoundAnded"
+
+
+    // $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 ) ) ) ;
+    public final EObject ruleJvmLowerBoundAnded() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        EObject lv_typeReference_1_0 = null;
+
+
+         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 ) ) )
+            {
+            // ../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 ) )
+            {
+            otherlv_0=(Token)match(input,61,FOLLOW_61_in_ruleJvmLowerBoundAnded5474); if (state.failed) return current;
+            if ( state.backtracking==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 )
+            {
+            // ../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
+            {
+            if ( state.backtracking==0 ) {
+               
+              	        newCompositeNode(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
+              	    
+            }
+            pushFollow(FOLLOW_ruleJvmTypeReference_in_ruleJvmLowerBoundAnded5495);
+            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 ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleJvmLowerBoundAnded"
+
+
+    // $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 ;
+    public final String entryRuleQualifiedNameWithWildcard() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleQualifiedNameWithWildcard = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getQualifiedNameWithWildcardRule()); 
+            }
+            pushFollow(FOLLOW_ruleQualifiedNameWithWildcard_in_entryRuleQualifiedNameWithWildcard5534);
+            iv_ruleQualifiedNameWithWildcard=ruleQualifiedNameWithWildcard();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleQualifiedNameWithWildcard.getText(); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedNameWithWildcard5545); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleQualifiedNameWithWildcard"
+
+
+    // $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= '*' ) ;
+    public final AntlrDatatypeRuleToken ruleQualifiedNameWithWildcard() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        AntlrDatatypeRuleToken this_QualifiedName_0 = null;
+
+
+         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= '*' )
+            {
+            // ../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= '*'
+            {
+            if ( state.backtracking==0 ) {
+               
+                      newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0()); 
+                  
+            }
+            pushFollow(FOLLOW_ruleQualifiedName_in_ruleQualifiedNameWithWildcard5592);
+            this_QualifiedName_0=ruleQualifiedName();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              		current.merge(this_QualifiedName_0);
+                  
+            }
+            if ( state.backtracking==0 ) {
+               
+                      afterParserOrEnumRuleCall();
+                  
+            }
+            kw=(Token)match(input,26,FOLLOW_26_in_ruleQualifiedNameWithWildcard5610); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                      current.merge(kw);
+                      newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1()); 
+                  
+            }
+            kw=(Token)match(input,63,FOLLOW_63_in_ruleQualifiedNameWithWildcard5623); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+                      current.merge(kw);
+                      newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2()); 
+                  
+            }
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleQualifiedNameWithWildcard"
+
+
+    // $ANTLR start "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 ;
+    public final EObject entryRuleXImportDeclaration() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleXImportDeclaration = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getXImportDeclarationRule()); 
+            }
+            pushFollow(FOLLOW_ruleXImportDeclaration_in_entryRuleXImportDeclaration5665);
+            iv_ruleXImportDeclaration=ruleXImportDeclaration();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleXImportDeclaration; 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleXImportDeclaration5675); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleXImportDeclaration"
+
+
+    // $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= ';' )? ) ;
+    public final EObject ruleXImportDeclaration() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Token lv_static_1_0=null;
+        Token lv_extension_2_0=null;
+        Token lv_wildcard_4_0=null;
+        Token otherlv_8=null;
+        AntlrDatatypeRuleToken lv_memberName_5_0 = null;
+
+        AntlrDatatypeRuleToken lv_importedNamespace_7_0 = null;
+
+
+         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= ';' )? )
+            {
+            // ../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= ';' )?
+            {
+            otherlv_0=(Token)match(input,64,FOLLOW_64_in_ruleXImportDeclaration5712); if (state.failed) return current;
+            if ( state.backtracking==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 ) ) )
+            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 ) ) ) )
+                    {
+                    // ../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 ) ) )
+                    {
+                    // ../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' )
+                    {
+                    // ../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'
+                    {
+                    lv_static_1_0=(Token)match(input,65,FOLLOW_65_in_ruleXImportDeclaration5732); if (state.failed) return current;
+                    if ( state.backtracking==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");
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2494:2: ( (lv_extension_2_0= 'extension' ) )?
+                    int alt31=2;
+                    int LA31_0 = input.LA(1);
+
+                    if ( (LA31_0==66) ) {
+                        alt31=1;
+                    }
+                    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' )
+                            {
+                            // ../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'
+                            {
+                            lv_extension_2_0=(Token)match(input,66,FOLLOW_66_in_ruleXImportDeclaration5763); if (state.failed) return current;
+                            if ( state.backtracking==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");
+                              	    
+                            }
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+                    // ../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 )
+                    {
+                    // ../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
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			if (current==null) {
+                      	            current = createModelElement(grammarAccess.getXImportDeclarationRule());
+                      	        }
+                              
+                    }
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_0_2_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleQualifiedNameInStaticImport_in_ruleXImportDeclaration5800);
+                    ruleQualifiedNameInStaticImport();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                      	        afterParserOrEnumRuleCall();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+                    // ../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 ) ) )
+                    int alt32=2;
+                    int LA32_0 = input.LA(1);
+
+                    if ( (LA32_0==63) ) {
+                        alt32=1;
+                    }
+                    else if ( (LA32_0==RULE_ID) ) {
+                        alt32=2;
+                    }
+                    else {
+                        if (state.backtracking>0) {state.failed=true; return current;}
+                        NoViableAltException nvae =
+                            new NoViableAltException("", 32, 0, input);
+
+                        throw nvae;
+                    }
+                    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= '*' ) )
+                            {
+                            // ../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= '*' )
+                            {
+                            // ../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= '*'
+                            {
+                            lv_wildcard_4_0=(Token)match(input,63,FOLLOW_63_in_ruleXImportDeclaration5819); if (state.failed) return current;
+                            if ( state.backtracking==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, "*");
+                              	    
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            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 ) )
+                            {
+                            // ../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 )
+                            {
+                            // ../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
+                            {
+                            if ( state.backtracking==0 ) {
+                               
+                              	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_1_0_3_1_0()); 
+                              	    
+                            }
+                            pushFollow(FOLLOW_ruleValidID_in_ruleXImportDeclaration5859);
+                            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();
+                              	    
+                            }
+
+                            }
+
+
+                            }
+
+
+                            }
+                            break;
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // ../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:2559:6: ( ( 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:2560:1: ( ruleQualifiedName )
+                    // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2561:3: ruleQualifiedName
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			if (current==null) {
+                      	            current = createModelElement(grammarAccess.getXImportDeclarationRule());
+                      	        }
+                              
+                    }
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_1_1_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleQualifiedName_in_ruleXImportDeclaration5890);
+                    ruleQualifiedName();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+                       
+                      	        afterParserOrEnumRuleCall();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    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 ) )
+                    {
+                    // ../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 )
+                    {
+                    // ../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
+                    {
+                    if ( state.backtracking==0 ) {
+                       
+                      	        newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_1_2_0()); 
+                      	    
+                    }
+                    pushFollow(FOLLOW_ruleQualifiedNameWithWildcard_in_ruleXImportDeclaration5917);
+                    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();
+                      	    
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2593:3: (otherlv_8= ';' )?
+            int alt34=2;
+            int LA34_0 = input.LA(1);
+
+            if ( (LA34_0==67) ) {
+                alt34=1;
+            }
+            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= ';'
+                    {
+                    otherlv_8=(Token)match(input,67,FOLLOW_67_in_ruleXImportDeclaration5931); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                          	newLeafNode(otherlv_8, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_2());
+                          
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleXImportDeclaration"
+
+
+    // $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 ;
+    public final String entryRuleQualifiedNameInStaticImport() throws RecognitionException {
+        String current = null;
+
+        AntlrDatatypeRuleToken iv_ruleQualifiedNameInStaticImport = null;
+
+
+        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
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getQualifiedNameInStaticImportRule()); 
+            }
+            pushFollow(FOLLOW_ruleQualifiedNameInStaticImport_in_entryRuleQualifiedNameInStaticImport5970);
+            iv_ruleQualifiedNameInStaticImport=ruleQualifiedNameInStaticImport();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleQualifiedNameInStaticImport.getText(); 
+            }
+            match(input,EOF,FOLLOW_EOF_in_entryRuleQualifiedNameInStaticImport5981); if (state.failed) return current;
+
+            }
+
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleQualifiedNameInStaticImport"
+
+
+    // $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= '.' )+ ;
+    public final AntlrDatatypeRuleToken ruleQualifiedNameInStaticImport() throws RecognitionException {
+        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
+
+        Token kw=null;
+        AntlrDatatypeRuleToken this_ValidID_0 = null;
+
+
+         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= '.' )+
+            {
+            // ../org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/parser/antlr/internal/InternalGridSource.g:2618:1: (this_ValidID_0= ruleValidID kw= '.' )+
+            int cnt35=0;
+            loop35:
+            do {
+                int alt35=2;
+                int LA35_0 = input.LA(1);
+
+                if ( (LA35_0==RULE_ID) ) {
+                    int LA35_2 = input.LA(2);
+
+                    if ( (LA35_2==26) ) {
+                        alt35=1;
+                    }
+
+
+                }
+
+
+                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= '.'
+            	    {
+            	    if ( state.backtracking==0 ) {
+            	       
+            	              newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0()); 
+            	          
+            	    }
+            	    pushFollow(FOLLOW_ruleValidID_in_ruleQualifiedNameInStaticImport6028);
+            	    this_ValidID_0=ruleValidID();
+
+            	    state._fsp--;
+            	    if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      		current.merge(this_ValidID_0);
+            	          
+            	    }
+            	    if ( state.backtracking==0 ) {
+            	       
+            	              afterParserOrEnumRuleCall();
+            	          
+            	    }
+            	    kw=(Token)match(input,26,FOLLOW_26_in_ruleQualifiedNameInStaticImport6046); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	              current.merge(kw);
+            	              newLeafNode(kw, grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1()); 
+            	          
+            	    }
+
+            	    }
+            	    break;
+
+            	default :
+            	    if ( cnt35 >= 1 ) break loop35;
+            	    if (state.backtracking>0) {state.failed=true; return current;}
+                        EarlyExitException eee =
+                            new EarlyExitException(35, input);
+                        throw eee;
+                }
+                cnt35++;
+            } while (true);
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleQualifiedNameInStaticImport"
+
+
+    // $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' ) ) ;
+    public final Enumerator ruleStyleCompare() throws RecognitionException {
+        Enumerator current = null;
+
+        Token enumLiteral_0=null;
+        Token enumLiteral_1=null;
+        Token enumLiteral_2=null;
+        Token enumLiteral_3=null;
+        Token enumLiteral_4=null;
+        Token enumLiteral_5=null;
+
+         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' ) )
+            {
+            // ../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' ) )
+            int alt36=6;
+            switch ( input.LA(1) ) {
+            case 68:
+                {
+                alt36=1;
+                }
+                break;
+            case 69:
+                {
+                alt36=2;
+                }
+                break;
+            case 70:
+                {
+                alt36=3;
+                }
+                break;
+            case 71:
+                {
+                alt36=4;
+                }
+                break;
+            case 72:
+                {
+                alt36=5;
+                }
+                break;
+            case 73:
+                {
+                alt36=6;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 36, 0, input);
+
+                throw nvae;
+            }
+
+            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' )
+                    {
+                    // ../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'
+                    {
+                    enumLiteral_0=(Token)match(input,68,FOLLOW_68_in_ruleStyleCompare6101); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                              current = grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                              newLeafNode(enumLiteral_0, grammarAccess.getStyleCompareAccess().getEqualEnumLiteralDeclaration_0()); 
+                          
+                    }
+
+                    }
+
+
+                    }
+                    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' )
+                    {
+                    // ../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'
+                    {
+                    enumLiteral_1=(Token)match(input,69,FOLLOW_69_in_ruleStyleCompare6118); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                              current = grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                              newLeafNode(enumLiteral_1, grammarAccess.getStyleCompareAccess().getGreaterEqualEnumLiteralDeclaration_1()); 
+                          
+                    }
+
+                    }
+
+
+                    }
+                    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' )
+                    {
+                    // ../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'
+                    {
+                    enumLiteral_2=(Token)match(input,70,FOLLOW_70_in_ruleStyleCompare6135); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                              current = grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                              newLeafNode(enumLiteral_2, grammarAccess.getStyleCompareAccess().getGreaterThanEnumLiteralDeclaration_2()); 
+                          
+                    }
+
+                    }
+
+
+                    }
+                    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' )
+                    {
+                    // ../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'
+                    {
+                    enumLiteral_3=(Token)match(input,71,FOLLOW_71_in_ruleStyleCompare6152); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                              current = grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                              newLeafNode(enumLiteral_3, grammarAccess.getStyleCompareAccess().getLowerEqualEnumLiteralDeclaration_3()); 
+                          
+                    }
+
+                    }
+
+
+                    }
+                    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' )
+                    {
+                    // ../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'
+                    {
+                    enumLiteral_4=(Token)match(input,72,FOLLOW_72_in_ruleStyleCompare6169); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                              current = grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+                              newLeafNode(enumLiteral_4, grammarAccess.getStyleCompareAccess().getLowerThanEnumLiteralDeclaration_4()); 
+                          
+                    }
+
+                    }
+
+
+                    }
+                    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' )
+                    {
+                    // ../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'
+                    {
+                    enumLiteral_5=(Token)match(input,73,FOLLOW_73_in_ruleStyleCompare6186); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                              current = grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+                              newLeafNode(enumLiteral_5, grammarAccess.getStyleCompareAccess().getNotEqualEnumLiteralDeclaration_5()); 
+                          
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+               leaveRule(); 
+            }
+        }
+         
+            catch (RecognitionException re) { 
+                recover(input,re); 
+                appendSkippedTokens();
+            } 
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleStyleCompare"
+
+    // $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: '.'
+        {
+        match(input,26,FOLLOW_26_in_synpred1_InternalGridSource3124); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred1_InternalGridSource
+
+    // $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 )
+        {
+        // ../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
+        {
+        // ../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: 
+        {
+        }
+
+        pushFollow(FOLLOW_ruleArrayBrackets_in_synpred2_InternalGridSource4081);
+        ruleArrayBrackets();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred2_InternalGridSource
+
+    // $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: '<'
+        {
+        match(input,57,FOLLOW_57_in_synpred3_InternalGridSource4533); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred3_InternalGridSource
+
+    // $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: ( () '.' )
+        {
+        // ../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: () '.'
+        {
+        // ../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: 
+        {
+        }
+
+        match(input,26,FOLLOW_26_in_synpred4_InternalGridSource4628); if (state.failed) return ;
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred4_InternalGridSource
+
+    // $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: '<'
+        {
+        match(input,57,FOLLOW_57_in_synpred5_InternalGridSource4685); if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred5_InternalGridSource
+
+    // Delegated rules
+
+    public final boolean synpred2_InternalGridSource() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred2_InternalGridSource_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred3_InternalGridSource() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred3_InternalGridSource_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred1_InternalGridSource() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred1_InternalGridSource_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred4_InternalGridSource() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred4_InternalGridSource_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred5_InternalGridSource() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred5_InternalGridSource_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+
+
+    protected 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 = {
+            "\1\2\74\uffff\1\1",
+            "",
+            "\1\3\50\uffff\1\4",
+            "\1\5\72\uffff\1\6",
+            "",
+            "\1\3\50\uffff\1\4",
+            ""
+    };
+
+    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]);
+        }
+    }
+
+    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;
+        }
+        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 ) ) )";
+        }
+    }
+ 
+
+    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});
+
+}
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
new file mode 100644
index 0000000..7d0e36f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/serializer/GridSourceSemanticSequencer.java
@@ -0,0 +1,523 @@
+/**
+ *                                                                            
+ *  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.serializer;
+
+import com.google.inject.Inject;
+import com.google.inject.Provider;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridNestedField;
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridNestedPath;
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridProperty;
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridSource;
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridSourceEQFilter;
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridSourceInput;
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridSourcePackage;
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropBooleanStyle;
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropButtonStyle;
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropDateStyle;
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropHtmlStyle;
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropImageStyle;
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropIndicatorStyle;
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropNumberStyle;
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropPriceStyle;
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropProgressbarStyle;
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropQuantityStyle;
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropTextStyle;
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridStyleConfigNumericToResource;
+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.common.types.JvmGenericArrayTypeReference;
+import org.eclipse.xtext.common.types.JvmInnerTypeReference;
+import org.eclipse.xtext.common.types.JvmLowerBound;
+import org.eclipse.xtext.common.types.JvmParameterizedTypeReference;
+import org.eclipse.xtext.common.types.JvmTypeParameter;
+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.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;
+import org.eclipse.xtext.xtype.XImportDeclaration;
+import org.eclipse.xtext.xtype.XImportSection;
+import org.eclipse.xtext.xtype.XtypePackage;
+
+@SuppressWarnings("all")
+public class GridSourceSemanticSequencer extends XtypeSemanticSequencer {
+
+	@Inject
+	private GridSourceGrammarAccess grammarAccess;
+	
+	public void createSequence(EObject context, EObject semanticObject) {
+		if(semanticObject.eClass().getEPackage() == CxGridSourcePackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+			case CxGridSourcePackage.CX_GRID_NESTED_FIELD:
+				if(context == grammarAccess.getNestedFieldRule()) {
+					sequence_NestedField(context, (CxGridNestedField) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridSourcePackage.CX_GRID_NESTED_PATH:
+				if(context == grammarAccess.getNestedPathRule()) {
+					sequence_NestedPath(context, (CxGridNestedPath) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridSourcePackage.CX_GRID_PROPERTY:
+				if(context == grammarAccess.getPropertyRule()) {
+					sequence_Property(context, (CxGridProperty) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridSourcePackage.CX_GRID_SOURCE:
+				if(context == grammarAccess.getSourceRule()) {
+					sequence_Source(context, (CxGridSource) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridSourcePackage.CX_GRID_SOURCE_EQ_FILTER:
+				if(context == grammarAccess.getEQFilterRule()) {
+					sequence_EQFilter(context, (CxGridSourceEQFilter) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridSourcePackage.CX_GRID_SOURCE_INPUT:
+				if(context == grammarAccess.getInputRule()) {
+					sequence_Input(context, (CxGridSourceInput) semanticObject); 
+					return; 
+				}
+				else break;
+			}
+		else if(semanticObject.eClass().getEPackage() == 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;
+			case CxGridStylePackage.CX_GRID_PROP_BUTTON_STYLE:
+				if(context == grammarAccess.getPropertyButtonStyleRule() ||
+				   context == grammarAccess.getPropertyStyleRule()) {
+					sequence_PropertyButtonStyle(context, (CxGridPropButtonStyle) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridStylePackage.CX_GRID_PROP_DATE_STYLE:
+				if(context == grammarAccess.getPropertyDateStyleRule() ||
+				   context == grammarAccess.getPropertyStyleRule()) {
+					sequence_PropertyDateStyle(context, (CxGridPropDateStyle) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridStylePackage.CX_GRID_PROP_HTML_STYLE:
+				if(context == grammarAccess.getPropertyHtmlStyleRule() ||
+				   context == grammarAccess.getPropertyStyleRule()) {
+					sequence_PropertyHtmlStyle(context, (CxGridPropHtmlStyle) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridStylePackage.CX_GRID_PROP_IMAGE_STYLE:
+				if(context == grammarAccess.getPropertyImageStyleRule() ||
+				   context == grammarAccess.getPropertyStyleRule()) {
+					sequence_PropertyImageStyle(context, (CxGridPropImageStyle) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridStylePackage.CX_GRID_PROP_INDICATOR_STYLE:
+				if(context == grammarAccess.getGridPropIndicatorStyleRule() ||
+				   context == grammarAccess.getPropertyStyleRule()) {
+					sequence_GridPropIndicatorStyle(context, (CxGridPropIndicatorStyle) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridStylePackage.CX_GRID_PROP_NUMBER_STYLE:
+				if(context == grammarAccess.getPropertyNumberStyleRule() ||
+				   context == grammarAccess.getPropertyStyleRule()) {
+					sequence_PropertyNumberStyle(context, (CxGridPropNumberStyle) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridStylePackage.CX_GRID_PROP_PRICE_STYLE:
+				if(context == grammarAccess.getPropertyPriceStyleRule() ||
+				   context == grammarAccess.getPropertyStyleRule()) {
+					sequence_PropertyPriceStyle(context, (CxGridPropPriceStyle) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridStylePackage.CX_GRID_PROP_PROGRESSBAR_STYLE:
+				if(context == grammarAccess.getPropertyProgressbarStyleRule() ||
+				   context == grammarAccess.getPropertyStyleRule()) {
+					sequence_PropertyProgressbarStyle(context, (CxGridPropProgressbarStyle) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridStylePackage.CX_GRID_PROP_QUANTITY_STYLE:
+				if(context == grammarAccess.getPropertyQuantityStyleRule() ||
+				   context == grammarAccess.getPropertyStyleRule()) {
+					sequence_PropertyQuantityStyle(context, (CxGridPropQuantityStyle) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridStylePackage.CX_GRID_PROP_TEXT_STYLE:
+				if(context == grammarAccess.getPropertyStyleRule() ||
+				   context == grammarAccess.getPropertyTextStyleRule()) {
+					sequence_PropertyTextStyle(context, (CxGridPropTextStyle) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridStylePackage.CX_GRID_STYLE_CONFIG_NUMERIC_TO_RESOURCE:
+				if(context == grammarAccess.getNumericToResourceStyleConfigRule() ||
+				   context == grammarAccess.getStyleConfigRule()) {
+					sequence_NumericToResourceStyleConfig(context, (CxGridStyleConfigNumericToResource) semanticObject); 
+					return; 
+				}
+				else break;
+			case CxGridStylePackage.CX_GRID_STYLE_CONFIG_STRING_TO_RESOURCE:
+				if(context == grammarAccess.getStringToResourceStyleConfigRule() ||
+				   context == grammarAccess.getStyleConfigRule()) {
+					sequence_StringToResourceStyleConfig(context, (CxGridStyleConfigStringToResource) semanticObject); 
+					return; 
+				}
+				else break;
+			}
+		else if(semanticObject.eClass().getEPackage() == 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;
+			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;
+			case TypesPackage.JVM_LOWER_BOUND:
+				if(context == grammarAccess.getJvmLowerBoundAndedRule()) {
+					sequence_JvmLowerBoundAnded(context, (JvmLowerBound) semanticObject); 
+					return; 
+				}
+				else if(context == 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()) {
+					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;
+			case TypesPackage.JVM_UPPER_BOUND:
+				if(context == grammarAccess.getJvmUpperBoundAndedRule()) {
+					sequence_JvmUpperBoundAnded(context, (JvmUpperBound) semanticObject); 
+					return; 
+				}
+				else if(context == 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;
+			}
+		else if(semanticObject.eClass().getEPackage() == XtypePackage.eINSTANCE) switch(semanticObject.eClass().getClassifierID()) {
+			case XtypePackage.XFUNCTION_TYPE_REF:
+				if(context == grammarAccess.getJvmArgumentTypeReferenceRule() ||
+				   context == grammarAccess.getJvmTypeReferenceRule() ||
+				   context == grammarAccess.getXFunctionTypeRefRule()) {
+					sequence_XFunctionTypeRef(context, (XFunctionTypeRef) semanticObject); 
+					return; 
+				}
+				else break;
+			case XtypePackage.XIMPORT_DECLARATION:
+				if(context == grammarAccess.getXImportDeclarationRule()) {
+					sequence_XImportDeclaration(context, (XImportDeclaration) semanticObject); 
+					return; 
+				}
+				else break;
+			case XtypePackage.XIMPORT_SECTION:
+				if(context == grammarAccess.getXImportSectionRule()) {
+					sequence_XImportSection(context, (XImportSection) semanticObject); 
+					return; 
+				}
+				else break;
+			}
+		if (errorAcceptor != null) errorAcceptor.accept(diagnosticProvider.createInvalidContextOrTypeDiagnostic(semanticObject, context));
+	}
+	
+	/**
+	 * 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)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridSourcePackage.Literals.CX_GRID_SOURCE_EQ_FILTER__ROOT_TYPE_PROPERTY_PATH));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getEQFilterAccess().getRootTypePropertyPathNestedFieldParserRuleCall_2_0(), semanticObject.getRootTypePropertyPath());
+		feeder.accept(grammarAccess.getEQFilterAccess().getInputTypePropertyPathNestedFieldParserRuleCall_5_0(), semanticObject.getInputTypePropertyPath());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (greenStarts=LDouble redEnds=LDouble)
+	 */
+	protected void sequence_GridPropIndicatorStyle(EObject context, CxGridPropIndicatorStyle semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (inputType=JvmTypeReference filters+=EQFilter filters+=EQFilter*)
+	 */
+	protected void sequence_Input(EObject context, CxGridSourceInput semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (field=[JvmOperation|ID] path=NestedPath?)
+	 */
+	protected void sequence_NestedField(EObject context, CxGridNestedField semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (field=[JvmOperation|ID] path=NestedPath?)
+	 */
+	protected void sequence_NestedPath(EObject context, CxGridNestedPath semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * 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)
+				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)
+				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);
+		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());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     {CxGridPropBooleanStyle}
+	 */
+	protected void sequence_PropertyBooleanStyle(EObject context, CxGridPropBooleanStyle semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * 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)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_EVENT_TOPIC_ABLE__EVENT_TOPIC));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getPropertyButtonStyleAccess().getEventTopicSTRINGTerminalRuleCall_3_0(), semanticObject.getEventTopic());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * 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)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_DATE_STYLE__DATE_FORMAT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getPropertyDateStyleAccess().getDateFormatSTRINGTerminalRuleCall_3_0(), semanticObject.getDateFormat());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     {CxGridPropHtmlStyle}
+	 */
+	protected void sequence_PropertyHtmlStyle(EObject context, CxGridPropHtmlStyle semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (eventTopic=STRING? configs+=StyleConfig*)
+	 */
+	protected void sequence_PropertyImageStyle(EObject context, CxGridPropImageStyle semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * 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)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_NUMBER_STYLE__NUMBER_FORMAT));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getPropertyNumberStyleAccess().getNumberFormatSTRINGTerminalRuleCall_3_0(), semanticObject.getNumberFormat());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (htmlPattern=STRING? valuePropertyPath=NestedField valueNumberFormat=STRING? currencyPropertyPath=NestedField)
+	 */
+	protected void sequence_PropertyPriceStyle(EObject context, CxGridPropPriceStyle semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * 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)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, CxGridStylePackage.Literals.CX_GRID_PROP_PROGRESSBAR_STYLE__MAX_VALUE));
+		}
+		INodesForEObjectProvider nodes = createNodeProvider(semanticObject);
+		SequenceFeeder feeder = createSequencerFeeder(semanticObject, nodes);
+		feeder.accept(grammarAccess.getPropertyProgressbarStyleAccess().getMaxValueLDoubleParserRuleCall_3_0(), semanticObject.getMaxValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (htmlPattern=STRING? valuePropertyPath=NestedField valueNumberFormat=STRING? uomPropertyPath=NestedField)
+	 */
+	protected void sequence_PropertyQuantityStyle(EObject context, CxGridPropQuantityStyle semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     {CxGridPropTextStyle}
+	 */
+	protected void sequence_PropertyTextStyle(EObject context, CxGridPropTextStyle semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (path=NestedField style=PropertyStyle)
+	 */
+	protected void sequence_Property(EObject context, CxGridProperty semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Constraint:
+	 *     (id=QualifiedName rootType=JvmTypeReference inputs+=Input* properties+=Property*)
+	 */
+	protected void sequence_Source(EObject context, CxGridSource semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * 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)
+				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)
+				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);
+		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
new file mode 100644
index 0000000..10bc755
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/serializer/GridSourceSyntacticSequencer.java
@@ -0,0 +1,92 @@
+/**
+ *                                                                            
+ *  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.serializer;
+
+import com.google.inject.Inject;
+import java.util.List;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.osbp.xtext.gridsource.services.GridSourceGrammarAccess;
+import org.eclipse.xtext.IGrammarAccess;
+import org.eclipse.xtext.RuleCall;
+import org.eclipse.xtext.nodemodel.INode;
+import org.eclipse.xtext.serializer.analysis.GrammarAlias.AbstractElementAlias;
+import org.eclipse.xtext.serializer.analysis.GrammarAlias.GroupAlias;
+import org.eclipse.xtext.serializer.analysis.GrammarAlias.TokenAlias;
+import org.eclipse.xtext.serializer.analysis.ISyntacticSequencerPDAProvider.ISynNavigable;
+import org.eclipse.xtext.serializer.analysis.ISyntacticSequencerPDAProvider.ISynTransition;
+import org.eclipse.xtext.serializer.sequencer.AbstractSyntacticSequencer;
+
+@SuppressWarnings("all")
+public class GridSourceSyntacticSequencer extends AbstractSyntacticSequencer {
+
+	protected GridSourceGrammarAccess grammarAccess;
+	protected AbstractElementAlias match_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q;
+	protected AbstractElementAlias match_XImportDeclaration_SemicolonKeyword_2_q;
+	
+	@Inject
+	protected void init(IGrammarAccess access) {
+		grammarAccess = (GridSourceGrammarAccess) access;
+		match_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0()), new TokenAlias(false, false, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2()));
+		match_XImportDeclaration_SemicolonKeyword_2_q = new TokenAlias(false, true, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_2());
+	}
+	
+	@Override
+	protected String getUnassignedRuleCallToken(EObject semanticObject, RuleCall ruleCall, INode node) {
+		if(ruleCall.getRule() == grammarAccess.getArrayBracketsRule())
+			return getArrayBracketsToken(semanticObject, ruleCall, node);
+		return "";
+	}
+	
+	/**
+	 * ArrayBrackets :
+	 * 	'[' ']'
+	 * ;
+	 */
+	protected String getArrayBracketsToken(EObject semanticObject, RuleCall ruleCall, INode node) {
+		if (node != null)
+			return getTokenText(node);
+		return "[]";
+	}
+	
+	@Override
+	protected void emitUnassignedTokens(EObject semanticObject, ISynTransition transition, INode fromNode, INode toNode) {
+		if (transition.getAmbiguousSyntaxes().isEmpty()) return;
+		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))
+				emit_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if(match_XImportDeclaration_SemicolonKeyword_2_q.equals(syntax))
+				emit_XImportDeclaration_SemicolonKeyword_2_q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else acceptNodes(getLastNavigableState(), syntaxNodes);
+		}
+	}
+
+	/**
+	 * Syntax:
+	 *     ('(' ')')?
+	 */
+	protected void emit_XFunctionTypeRef___LeftParenthesisKeyword_0_0_RightParenthesisKeyword_0_2__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+		acceptNodes(transition, nodes);
+	}
+	
+	/**
+	 * Syntax:
+	 *     ';'?
+	 */
+	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
new file mode 100644
index 0000000..4b34d4f
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/services/GridSourceGrammarAccess.java
@@ -0,0 +1,1671 @@
+/**
+ *                                                                            
+ *  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.services;
+
+import com.google.inject.Singleton;
+import com.google.inject.Inject;
+
+import java.util.List;
+
+import org.eclipse.xtext.*;
+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 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);
+		private final RuleCall cIdQualifiedNameParserRuleCall_1_0 = (RuleCall)cIdAssignment_1.eContents().get(0);
+		private final Keyword cForKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cRootTypeAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cRootTypeJvmTypeReferenceParserRuleCall_3_0 = (RuleCall)cRootTypeAssignment_3.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Keyword cInputsKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Keyword cLeftCurlyBracketKeyword_6 = (Keyword)cGroup.eContents().get(6);
+		private final Assignment cInputsAssignment_7 = (Assignment)cGroup.eContents().get(7);
+		private final RuleCall cInputsInputParserRuleCall_7_0 = (RuleCall)cInputsAssignment_7.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8 = (Keyword)cGroup.eContents().get(8);
+		private final Assignment cPropertiesAssignment_9 = (Assignment)cGroup.eContents().get(9);
+		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*
+		//"}"
+		public Group getGroup() { return cGroup; }
+
+		//"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"
+		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"
+		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 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);
+		private final RuleCall cInputTypeJvmTypeReferenceParserRuleCall_1_0 = (RuleCall)cInputTypeAssignment_1.eContents().get(0);
+		private final Keyword cFiltersKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cFiltersAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cFiltersEQFilterParserRuleCall_3_0 = (RuleCall)cFiltersAssignment_3.eContents().get(0);
+		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
+		private final Keyword cAmpersandAmpersandKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		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)*
+		public Group getGroup() { return cGroup; }
+
+		//"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"
+		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)*
+		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 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);
+		private final Assignment cRootTypePropertyPathAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cRootTypePropertyPathNestedFieldParserRuleCall_2_0 = (RuleCall)cRootTypePropertyPathAssignment_2.eContents().get(0);
+		private final Keyword cEqualsSignKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Keyword cInputKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		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
+		public Group getGroup() { return cGroup; }
+
+		//{CxGridSourceEQFilter}
+		public Action getCxGridSourceEQFilterAction_0() { return cCxGridSourceEQFilterAction_0; }
+
+		//"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:"
+		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 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);
+		private final RuleCall cPathNestedFieldParserRuleCall_1_0 = (RuleCall)cPathAssignment_1.eContents().get(0);
+		private final Keyword cStyleKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		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
+		public Group getGroup() { return cGroup; }
+
+		//"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"
+		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 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);
+		private final CrossReference cFieldJvmOperationCrossReference_1_0 = (CrossReference)cFieldAssignment_1.eContents().get(0);
+		private final RuleCall cFieldJvmOperationIDTerminalRuleCall_1_0_1 = (RuleCall)cFieldJvmOperationCrossReference_1_0.eContents().get(1);
+		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?
+		public Group getGroup() { return cGroup; }
+
+		//{CxGridNestedField}
+		public Action getCxGridNestedFieldAction_0() { return cCxGridNestedFieldAction_0; }
+
+		//field=[JvmOperation]
+		public Assignment getFieldAssignment_1() { return cFieldAssignment_1; }
+
+		//[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 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);
+		private final Assignment cFieldAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final CrossReference cFieldJvmOperationCrossReference_2_0 = (CrossReference)cFieldAssignment_2.eContents().get(0);
+		private final RuleCall cFieldJvmOperationIDTerminalRuleCall_2_0_1 = (RuleCall)cFieldJvmOperationCrossReference_2_0.eContents().get(1);
+		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?
+		public Group getGroup() { return cGroup; }
+
+		//{CxGridNestedPath}
+		public Action getCxGridNestedPathAction_0() { return cCxGridNestedPathAction_0; }
+
+		//"."
+		public Keyword getFullStopKeyword_1() { return cFullStopKeyword_1; }
+
+		//field=[JvmOperation]
+		public Assignment getFieldAssignment_2() { return cFieldAssignment_2; }
+
+		//[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 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);
+		private final RuleCall cPropertyProgressbarStyleParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cPropertyTextStyleParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
+		private final RuleCall cPropertyBooleanStyleParserRuleCall_4 = (RuleCall)cAlternatives.eContents().get(4);
+		private final RuleCall cPropertyDateStyleParserRuleCall_5 = (RuleCall)cAlternatives.eContents().get(5);
+		private final RuleCall cPropertyNumberStyleParserRuleCall_6 = (RuleCall)cAlternatives.eContents().get(6);
+		private final RuleCall cPropertyImageStyleParserRuleCall_7 = (RuleCall)cAlternatives.eContents().get(7);
+		private final RuleCall cPropertyQuantityStyleParserRuleCall_8 = (RuleCall)cAlternatives.eContents().get(8);
+		private final RuleCall cPropertyPriceStyleParserRuleCall_9 = (RuleCall)cAlternatives.eContents().get(9);
+		private final RuleCall cGridPropIndicatorStyleParserRuleCall_10 = (RuleCall)cAlternatives.eContents().get(10);
+		
+		//PropertyStyle returns style::CxGridPropStyle:
+		//	PropertyButtonStyle | PropertyHtmlStyle | PropertyProgressbarStyle | PropertyTextStyle | PropertyBooleanStyle |
+		//	PropertyDateStyle | PropertyNumberStyle | PropertyImageStyle | PropertyQuantityStyle | PropertyPriceStyle |
+		//	GridPropIndicatorStyle;
+		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 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);
+		private final Keyword cEventTopicKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		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
+		public Group getGroup() { return cGroup; }
+
+		//{style::CxGridPropButtonStyle}
+		public Action getCxGridPropButtonStyleAction_0() { return cCxGridPropButtonStyleAction_0; }
+
+		//"buttonStyle"
+		public Keyword getButtonStyleKeyword_1() { return cButtonStyleKeyword_1; }
+
+		//"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 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"
+		public Group getGroup() { return cGroup; }
+
+		//{style::CxGridPropHtmlStyle}
+		public Action getCxGridPropHtmlStyleAction_0() { return cCxGridPropHtmlStyleAction_0; }
+
+		//"htmlStyle"
+		public Keyword getHtmlStyleKeyword_1() { return cHtmlStyleKeyword_1; }
+	}
+
+	public class PropertyBooleanStyleElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "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"
+		public Group getGroup() { return cGroup; }
+
+		//{style::CxGridPropBooleanStyle}
+		public Action getCxGridPropBooleanStyleAction_0() { return cCxGridPropBooleanStyleAction_0; }
+
+		//"boolStyle"
+		public Keyword getBoolStyleKeyword_1() { return cBoolStyleKeyword_1; }
+	}
+
+	public class PropertyDateStyleElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "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);
+		private final Keyword cFormatKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		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
+		public Group getGroup() { return cGroup; }
+
+		//{style::CxGridPropDateStyle}
+		public Action getCxGridPropDateStyleAction_0() { return cCxGridPropDateStyleAction_0; }
+
+		//"dateStyle"
+		public Keyword getDateStyleKeyword_1() { return cDateStyleKeyword_1; }
+
+		//"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 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);
+		private final Keyword cFormatKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		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
+		public Group getGroup() { return cGroup; }
+
+		//{style::CxGridPropNumberStyle}
+		public Action getCxGridPropNumberStyleAction_0() { return cCxGridPropNumberStyleAction_0; }
+
+		//"numberStyle"
+		public Keyword getNumberStyleKeyword_1() { return cNumberStyleKeyword_1; }
+
+		//"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 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);
+		private final Keyword cMaxKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		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
+		public Group getGroup() { return cGroup; }
+
+		//{style::CxGridPropProgressbarStyle}
+		public Action getCxGridPropProgressbarStyleAction_0() { return cCxGridPropProgressbarStyleAction_0; }
+
+		//"progressbarStyle"
+		public Keyword getProgressbarStyleKeyword_1() { return cProgressbarStyleKeyword_1; }
+
+		//"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 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);
+		private final Keyword cGreenFromKeyword_2 = (Keyword)cGroup.eContents().get(2);
+		private final Assignment cGreenStartsAssignment_3 = (Assignment)cGroup.eContents().get(3);
+		private final RuleCall cGreenStartsLDoubleParserRuleCall_3_0 = (RuleCall)cGreenStartsAssignment_3.eContents().get(0);
+		private final Keyword cRedUntilKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		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
+		public Group getGroup() { return cGroup; }
+
+		//{style::CxGridPropIndicatorStyle}
+		public Action getCxGridPropIndicatorStyleAction_0() { return cCxGridPropIndicatorStyleAction_0; }
+
+		//"indicatorStyle"
+		public Keyword getIndicatorStyleKeyword_1() { return cIndicatorStyleKeyword_1; }
+
+		//"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"
+		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 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);
+		private final Assignment cHtmlPatternAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cHtmlPatternSTRINGTerminalRuleCall_2_0 = (RuleCall)cHtmlPatternAssignment_2.eContents().get(0);
+		private final Keyword cValueKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Keyword cEqualsSignKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cValuePropertyPathAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cValuePropertyPathNestedFieldParserRuleCall_5_0 = (RuleCall)cValuePropertyPathAssignment_5.eContents().get(0);
+		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
+		private final Keyword cLeftParenthesisKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
+		private final Keyword cFormatKeyword_6_1 = (Keyword)cGroup_6.eContents().get(1);
+		private final Assignment cValueNumberFormatAssignment_6_2 = (Assignment)cGroup_6.eContents().get(2);
+		private final RuleCall cValueNumberFormatSTRINGTerminalRuleCall_6_2_0 = (RuleCall)cValueNumberFormatAssignment_6_2.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_6_3 = (Keyword)cGroup_6.eContents().get(3);
+		private final Keyword cUomKeyword_7 = (Keyword)cGroup.eContents().get(7);
+		private final Keyword cEqualsSignKeyword_8 = (Keyword)cGroup.eContents().get(8);
+		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
+		public Group getGroup() { return cGroup; }
+
+		//{style::CxGridPropQuantityStyle}
+		public Action getCxGridPropQuantityStyleAction_0() { return cCxGridPropQuantityStyleAction_0; }
+
+		//"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"
+		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 ")")?
+		public Group getGroup_6() { return cGroup_6; }
+
+		//"("
+		public Keyword getLeftParenthesisKeyword_6_0() { return cLeftParenthesisKeyword_6_0; }
+
+		//"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"
+		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 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);
+		private final Assignment cHtmlPatternAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cHtmlPatternSTRINGTerminalRuleCall_2_0 = (RuleCall)cHtmlPatternAssignment_2.eContents().get(0);
+		private final Keyword cValueKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Keyword cEqualsSignKeyword_4 = (Keyword)cGroup.eContents().get(4);
+		private final Assignment cValuePropertyPathAssignment_5 = (Assignment)cGroup.eContents().get(5);
+		private final RuleCall cValuePropertyPathNestedFieldParserRuleCall_5_0 = (RuleCall)cValuePropertyPathAssignment_5.eContents().get(0);
+		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
+		private final Keyword cLeftParenthesisKeyword_6_0 = (Keyword)cGroup_6.eContents().get(0);
+		private final Keyword cFormatKeyword_6_1 = (Keyword)cGroup_6.eContents().get(1);
+		private final Assignment cValueNumberFormatAssignment_6_2 = (Assignment)cGroup_6.eContents().get(2);
+		private final RuleCall cValueNumberFormatSTRINGTerminalRuleCall_6_2_0 = (RuleCall)cValueNumberFormatAssignment_6_2.eContents().get(0);
+		private final Keyword cRightParenthesisKeyword_6_3 = (Keyword)cGroup_6.eContents().get(3);
+		private final Keyword cCurrencyKeyword_7 = (Keyword)cGroup.eContents().get(7);
+		private final Keyword cEqualsSignKeyword_8 = (Keyword)cGroup.eContents().get(8);
+		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
+		public Group getGroup() { return cGroup; }
+
+		//{style::CxGridPropPriceStyle}
+		public Action getCxGridPropPriceStyleAction_0() { return cCxGridPropPriceStyleAction_0; }
+
+		//"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"
+		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 ")")?
+		public Group getGroup_6() { return cGroup_6; }
+
+		//"("
+		public Keyword getLeftParenthesisKeyword_6_0() { return cLeftParenthesisKeyword_6_0; }
+
+		//"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"
+		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 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"
+		public Group getGroup() { return cGroup; }
+
+		//{style::CxGridPropTextStyle}
+		public Action getCxGridPropTextStyleAction_0() { return cCxGridPropTextStyleAction_0; }
+
+		//"textStyle"
+		public Keyword getTextStyleKeyword_1() { return cTextStyleKeyword_1; }
+	}
+
+	public class PropertyImageStyleElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "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);
+		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
+		private final Keyword cEventTopicKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
+		private final Assignment cEventTopicAssignment_2_1 = (Assignment)cGroup_2.eContents().get(1);
+		private final RuleCall cEventTopicSTRINGTerminalRuleCall_2_1_0 = (RuleCall)cEventTopicAssignment_2_1.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cConfigsAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		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* "}"
+		public Group getGroup() { return cGroup; }
+
+		//{style::CxGridPropImageStyle}
+		public Action getCxGridPropImageStyleAction_0() { return cCxGridPropImageStyleAction_0; }
+
+		//"imageStyle"
+		public Keyword getImageStyleKeyword_1() { return cImageStyleKeyword_1; }
+
+		//("eventTopic" eventTopic=STRING)?
+		public Group getGroup_2() { return cGroup_2; }
+
+		//"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 Group cGroup = (Group)rule.eContents().get(1);
+		private final RuleCall cValidIDParserRuleCall_0 = (RuleCall)cGroup.eContents().get(0);
+		private final Group cGroup_1 = (Group)cGroup.eContents().get(1);
+		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
+		private final RuleCall cValidIDParserRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
+		
+		//QualifiedName:
+		//	ValidID ("." ValidID)*;
+		public ParserRule getRule() { return rule; }
+
+		//ValidID ("." ValidID)*
+		public Group getGroup() { return cGroup; }
+
+		//ValidID
+		public RuleCall getValidIDParserRuleCall_0() { return cValidIDParserRuleCall_0; }
+
+		//(=> "." ValidID)*
+		public Group getGroup_1() { return cGroup_1; }
+
+		//=> "."
+		public Keyword getFullStopKeyword_1_0() { return cFullStopKeyword_1_0; }
+
+		//ValidID
+		public RuleCall getValidIDParserRuleCall_1_1() { return cValidIDParserRuleCall_1_1; }
+	}
+
+	public class ValidIDElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "ValidID");
+		private final RuleCall cIDTerminalRuleCall = (RuleCall)rule.eContents().get(1);
+		
+		//ValidID:
+		//	ID;
+		public ParserRule getRule() { return rule; }
+
+		//ID
+		public RuleCall getIDTerminalRuleCall() { return cIDTerminalRuleCall; }
+	}
+
+	public class StyleConfigElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "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:
+		//	NumericToResourceStyleConfig | StringToResourceStyleConfig;
+		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 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);
+		private final RuleCall cCompareStyleCompareEnumRuleCall_1_0 = (RuleCall)cCompareAssignment_1.eContents().get(0);
+		private final Assignment cValueAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cValueLDoubleParserRuleCall_2_0 = (RuleCall)cValueAssignment_2.eContents().get(0);
+		private final Keyword cThenKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		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
+		public Group getGroup() { return cGroup; }
+
+		//"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"
+		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 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);
+		private final RuleCall cCompareStyleCompareEnumRuleCall_1_0 = (RuleCall)cCompareAssignment_1.eContents().get(0);
+		private final Assignment cValueAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cValueSTRINGTerminalRuleCall_2_0 = (RuleCall)cValueAssignment_2.eContents().get(0);
+		private final Keyword cThenKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		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
+		public Group getGroup() { return cGroup; }
+
+		//"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"
+		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 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
+		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 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)?
+		public Group getGroup() { return cGroup; }
+
+		//LInt
+		public RuleCall getLIntParserRuleCall_0() { return cLIntParserRuleCall_0; }
+
+		//("." 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 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);
+		private final EnumLiteralDeclaration cGreaterEqualEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
+		private final Keyword cGreaterEqualGreaterEqualKeyword_1_0 = (Keyword)cGreaterEqualEnumLiteralDeclaration_1.eContents().get(0);
+		private final EnumLiteralDeclaration cGreaterThanEnumLiteralDeclaration_2 = (EnumLiteralDeclaration)cAlternatives.eContents().get(2);
+		private final Keyword cGreaterThanGreaterThanKeyword_2_0 = (Keyword)cGreaterThanEnumLiteralDeclaration_2.eContents().get(0);
+		private final EnumLiteralDeclaration cLowerEqualEnumLiteralDeclaration_3 = (EnumLiteralDeclaration)cAlternatives.eContents().get(3);
+		private final Keyword cLowerEqualLowerEqualKeyword_3_0 = (Keyword)cLowerEqualEnumLiteralDeclaration_3.eContents().get(0);
+		private final EnumLiteralDeclaration cLowerThanEnumLiteralDeclaration_4 = (EnumLiteralDeclaration)cAlternatives.eContents().get(4);
+		private final Keyword cLowerThanLowerThanKeyword_4_0 = (Keyword)cLowerThanEnumLiteralDeclaration_4.eContents().get(0);
+		private final EnumLiteralDeclaration cNotEqualEnumLiteralDeclaration_5 = (EnumLiteralDeclaration)cAlternatives.eContents().get(5);
+		private final Keyword cNotEqualNotEqualKeyword_5_0 = (Keyword)cNotEqualEnumLiteralDeclaration_5.eContents().get(0);
+		
+		//enum StyleCompare returns style::CxGridCompare:
+		//	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; }
+	}
+	
+	private final SourceElements pSource;
+	private final InputElements pInput;
+	private final EQFilterElements pEQFilter;
+	private final PropertyElements pProperty;
+	private final NestedFieldElements pNestedField;
+	private final NestedPathElements pNestedPath;
+	private final PropertyStyleElements pPropertyStyle;
+	private final PropertyButtonStyleElements pPropertyButtonStyle;
+	private final PropertyHtmlStyleElements pPropertyHtmlStyle;
+	private final PropertyBooleanStyleElements pPropertyBooleanStyle;
+	private final PropertyDateStyleElements pPropertyDateStyle;
+	private final PropertyNumberStyleElements pPropertyNumberStyle;
+	private final PropertyProgressbarStyleElements pPropertyProgressbarStyle;
+	private final GridPropIndicatorStyleElements pGridPropIndicatorStyle;
+	private final PropertyQuantityStyleElements pPropertyQuantityStyle;
+	private final PropertyPriceStyleElements pPropertyPriceStyle;
+	private final PropertyTextStyleElements pPropertyTextStyle;
+	private final PropertyImageStyleElements pPropertyImageStyle;
+	private final QualifiedNameElements pQualifiedName;
+	private final ValidIDElements pValidID;
+	private final StyleConfigElements pStyleConfig;
+	private final NumericToResourceStyleConfigElements pNumericToResourceStyleConfig;
+	private final StringToResourceStyleConfigElements pStringToResourceStyleConfig;
+	private final StyleCompareElements unknownRuleStyleCompare;
+	private final TerminalRule tID;
+	private final TerminalRule tINT;
+	private final TerminalRule tTHEME_RESOURCE;
+	private final LIntElements pLInt;
+	private final LDoubleElements pLDouble;
+	private final TerminalRule tEVENT_TOPIC;
+	
+	private final Grammar grammar;
+
+	private final XtypeGrammarAccess gaXtype;
+
+	@Inject
+	public GridSourceGrammarAccess(GrammarProvider grammarProvider,
+		XtypeGrammarAccess gaXtype) {
+		this.grammar = internalFindGrammar(grammarProvider);
+		this.gaXtype = gaXtype;
+		this.pSource = new SourceElements();
+		this.pInput = new InputElements();
+		this.pEQFilter = new EQFilterElements();
+		this.pProperty = new PropertyElements();
+		this.pNestedField = new NestedFieldElements();
+		this.pNestedPath = new NestedPathElements();
+		this.pPropertyStyle = new PropertyStyleElements();
+		this.pPropertyButtonStyle = new PropertyButtonStyleElements();
+		this.pPropertyHtmlStyle = new PropertyHtmlStyleElements();
+		this.pPropertyBooleanStyle = new PropertyBooleanStyleElements();
+		this.pPropertyDateStyle = new PropertyDateStyleElements();
+		this.pPropertyNumberStyle = new PropertyNumberStyleElements();
+		this.pPropertyProgressbarStyle = new PropertyProgressbarStyleElements();
+		this.pGridPropIndicatorStyle = new GridPropIndicatorStyleElements();
+		this.pPropertyQuantityStyle = new PropertyQuantityStyleElements();
+		this.pPropertyPriceStyle = new PropertyPriceStyleElements();
+		this.pPropertyTextStyle = new PropertyTextStyleElements();
+		this.pPropertyImageStyle = new PropertyImageStyleElements();
+		this.pQualifiedName = new QualifiedNameElements();
+		this.pValidID = new ValidIDElements();
+		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.pLInt = new LIntElements();
+		this.pLDouble = new LDoubleElements();
+		this.tEVENT_TOPIC = (TerminalRule) GrammarUtil.findRuleForName(getGrammar(), "EVENT_TOPIC");
+	}
+	
+	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
+		Grammar grammar = grammarProvider.getGrammar(this);
+		while (grammar != null) {
+			if ("org.eclipse.osbp.xtext.gridsource.GridSource".equals(grammar.getName())) {
+				return grammar;
+			}
+			List<Grammar> grammars = grammar.getUsedGrammars();
+			if (!grammars.isEmpty()) {
+				grammar = grammars.iterator().next();
+			} else {
+				return null;
+			}
+		}
+		return grammar;
+	}
+	
+	
+	public Grammar getGrammar() {
+		return grammar;
+	}
+	
+
+	public XtypeGrammarAccess getXtypeGrammarAccess() {
+		return gaXtype;
+	}
+
+	
+	//Source returns CxGridSource:
+	//	"gridsource" id=QualifiedName "for" rootType=JvmTypeReference "{" "inputs" "{" inputs+=Input* "}"
+	//	properties+=Property* "}";
+	public SourceElements getSourceAccess() {
+		return pSource;
+	}
+	
+	public ParserRule getSourceRule() {
+		return getSourceAccess().getRule();
+	}
+
+	//Input returns CxGridSourceInput:
+	//	"inputType" inputType=JvmTypeReference "filters" filters+=EQFilter ("&&" filters+=EQFilter)*;
+	public InputElements getInputAccess() {
+		return pInput;
+	}
+	
+	public ParserRule getInputRule() {
+		return getInputAccess().getRule();
+	}
+
+	//EQFilter returns CxGridSourceEQFilter:
+	//	{CxGridSourceEQFilter} "root:" rootTypePropertyPath=NestedField "=" "input:" inputTypePropertyPath=NestedField;
+	public EQFilterElements getEQFilterAccess() {
+		return pEQFilter;
+	}
+	
+	public ParserRule getEQFilterRule() {
+		return getEQFilterAccess().getRule();
+	}
+
+	//Property returns CxGridProperty:
+	//	"prop" path=NestedField "style" style=PropertyStyle;
+	public PropertyElements getPropertyAccess() {
+		return pProperty;
+	}
+	
+	public ParserRule getPropertyRule() {
+		return getPropertyAccess().getRule();
+	}
+
+	//NestedField returns CxGridNestedField:
+	//	{CxGridNestedField} field=[JvmOperation] path=NestedPath?;
+	public NestedFieldElements getNestedFieldAccess() {
+		return pNestedField;
+	}
+	
+	public ParserRule getNestedFieldRule() {
+		return getNestedFieldAccess().getRule();
+	}
+
+	//NestedPath returns CxGridNestedPath:
+	//	{CxGridNestedPath} "." field=[JvmOperation] path=NestedPath?;
+	public NestedPathElements getNestedPathAccess() {
+		return pNestedPath;
+	}
+	
+	public ParserRule getNestedPathRule() {
+		return getNestedPathAccess().getRule();
+	}
+
+	//PropertyStyle returns style::CxGridPropStyle:
+	//	PropertyButtonStyle | PropertyHtmlStyle | PropertyProgressbarStyle | PropertyTextStyle | PropertyBooleanStyle |
+	//	PropertyDateStyle | PropertyNumberStyle | PropertyImageStyle | PropertyQuantityStyle | PropertyPriceStyle |
+	//	GridPropIndicatorStyle;
+	public PropertyStyleElements getPropertyStyleAccess() {
+		return pPropertyStyle;
+	}
+	
+	public ParserRule getPropertyStyleRule() {
+		return getPropertyStyleAccess().getRule();
+	}
+
+	//PropertyButtonStyle returns style::CxGridPropButtonStyle:
+	//	{style::CxGridPropButtonStyle} "buttonStyle" "eventTopic" eventTopic=STRING;
+	public PropertyButtonStyleElements getPropertyButtonStyleAccess() {
+		return pPropertyButtonStyle;
+	}
+	
+	public ParserRule getPropertyButtonStyleRule() {
+		return getPropertyButtonStyleAccess().getRule();
+	}
+
+	//PropertyHtmlStyle returns style::CxGridPropHtmlStyle:
+	//	{style::CxGridPropHtmlStyle} "htmlStyle";
+	public PropertyHtmlStyleElements getPropertyHtmlStyleAccess() {
+		return pPropertyHtmlStyle;
+	}
+	
+	public ParserRule getPropertyHtmlStyleRule() {
+		return getPropertyHtmlStyleAccess().getRule();
+	}
+
+	//PropertyBooleanStyle returns style::CxGridPropBooleanStyle:
+	//	{style::CxGridPropBooleanStyle} "boolStyle";
+	public PropertyBooleanStyleElements getPropertyBooleanStyleAccess() {
+		return pPropertyBooleanStyle;
+	}
+	
+	public ParserRule getPropertyBooleanStyleRule() {
+		return getPropertyBooleanStyleAccess().getRule();
+	}
+
+	//PropertyDateStyle returns style::CxGridPropDateStyle:
+	//	{style::CxGridPropDateStyle} "dateStyle" "format" dateFormat=STRING;
+	public PropertyDateStyleElements getPropertyDateStyleAccess() {
+		return pPropertyDateStyle;
+	}
+	
+	public ParserRule getPropertyDateStyleRule() {
+		return getPropertyDateStyleAccess().getRule();
+	}
+
+	//PropertyNumberStyle returns style::CxGridPropNumberStyle:
+	//	{style::CxGridPropNumberStyle} "numberStyle" "format" numberFormat=STRING;
+	public PropertyNumberStyleElements getPropertyNumberStyleAccess() {
+		return pPropertyNumberStyle;
+	}
+	
+	public ParserRule getPropertyNumberStyleRule() {
+		return getPropertyNumberStyleAccess().getRule();
+	}
+
+	//PropertyProgressbarStyle returns style::CxGridPropProgressbarStyle:
+	//	{style::CxGridPropProgressbarStyle} "progressbarStyle" "max" maxValue=LDouble;
+	public PropertyProgressbarStyleElements getPropertyProgressbarStyleAccess() {
+		return pPropertyProgressbarStyle;
+	}
+	
+	public ParserRule getPropertyProgressbarStyleRule() {
+		return getPropertyProgressbarStyleAccess().getRule();
+	}
+
+	//GridPropIndicatorStyle returns style::CxGridPropIndicatorStyle:
+	//	{style::CxGridPropIndicatorStyle} "indicatorStyle" "greenFrom" greenStarts=LDouble "redUntil" redEnds=LDouble;
+	public GridPropIndicatorStyleElements getGridPropIndicatorStyleAccess() {
+		return pGridPropIndicatorStyle;
+	}
+	
+	public ParserRule getGridPropIndicatorStyleRule() {
+		return getGridPropIndicatorStyleAccess().getRule();
+	}
+
+	//PropertyQuantityStyle returns style::CxGridPropQuantityStyle:
+	//	{style::CxGridPropQuantityStyle} "quantityStyle" htmlPattern=STRING? "value" "=" valuePropertyPath=NestedField ("("
+	//	"format" valueNumberFormat=STRING ")")? "uom" "=" uomPropertyPath=NestedField;
+	public PropertyQuantityStyleElements getPropertyQuantityStyleAccess() {
+		return pPropertyQuantityStyle;
+	}
+	
+	public ParserRule getPropertyQuantityStyleRule() {
+		return getPropertyQuantityStyleAccess().getRule();
+	}
+
+	//PropertyPriceStyle returns style::CxGridPropPriceStyle:
+	//	{style::CxGridPropPriceStyle} "priceStyle" htmlPattern=STRING? "value" "=" valuePropertyPath=NestedField ("(" "format"
+	//	valueNumberFormat=STRING ")")? "currency" "=" currencyPropertyPath=NestedField;
+	public PropertyPriceStyleElements getPropertyPriceStyleAccess() {
+		return pPropertyPriceStyle;
+	}
+	
+	public ParserRule getPropertyPriceStyleRule() {
+		return getPropertyPriceStyleAccess().getRule();
+	}
+
+	//PropertyTextStyle returns style::CxGridPropTextStyle:
+	//	{style::CxGridPropTextStyle} "textStyle";
+	public PropertyTextStyleElements getPropertyTextStyleAccess() {
+		return pPropertyTextStyle;
+	}
+	
+	public ParserRule getPropertyTextStyleRule() {
+		return getPropertyTextStyleAccess().getRule();
+	}
+
+	//PropertyImageStyle returns style::CxGridPropImageStyle:
+	//	{style::CxGridPropImageStyle} "imageStyle" ("eventTopic" eventTopic=STRING)? "{" configs+=StyleConfig* "}";
+	public PropertyImageStyleElements getPropertyImageStyleAccess() {
+		return pPropertyImageStyle;
+	}
+	
+	public ParserRule getPropertyImageStyleRule() {
+		return getPropertyImageStyleAccess().getRule();
+	}
+
+	//QualifiedName:
+	//	ValidID ("." ValidID)*;
+	public QualifiedNameElements getQualifiedNameAccess() {
+		return pQualifiedName;
+	}
+	
+	public ParserRule getQualifiedNameRule() {
+		return getQualifiedNameAccess().getRule();
+	}
+
+	//ValidID:
+	//	ID;
+	public ValidIDElements getValidIDAccess() {
+		return pValidID;
+	}
+	
+	public ParserRule getValidIDRule() {
+		return getValidIDAccess().getRule();
+	}
+
+	//StyleConfig returns style::CxGridStyleConfig:
+	//	NumericToResourceStyleConfig | StringToResourceStyleConfig;
+	public StyleConfigElements getStyleConfigAccess() {
+		return pStyleConfig;
+	}
+	
+	public ParserRule getStyleConfigRule() {
+		return getStyleConfigAccess().getRule();
+	}
+
+	//NumericToResourceStyleConfig returns style::CxGridStyleConfigNumericToResource:
+	//	"number" compare=StyleCompare value=LDouble "then" resourceThemePath=THEME_RESOURCE;
+	public NumericToResourceStyleConfigElements getNumericToResourceStyleConfigAccess() {
+		return pNumericToResourceStyleConfig;
+	}
+	
+	public ParserRule getNumericToResourceStyleConfigRule() {
+		return getNumericToResourceStyleConfigAccess().getRule();
+	}
+
+	//StringToResourceStyleConfig returns style::CxGridStyleConfigStringToResource:
+	//	"string" compare=StyleCompare value=STRING "then" resourceThemePath=THEME_RESOURCE;
+	public StringToResourceStyleConfigElements getStringToResourceStyleConfigAccess() {
+		return pStringToResourceStyleConfig;
+	}
+	
+	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;
+	}
+	
+	public EnumRule getStyleCompareRule() {
+		return getStyleCompareAccess().getRule();
+	}
+
+	//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" | "_")*;
+	public TerminalRule getINTRule() {
+		return tINT;
+	} 
+
+	//terminal THEME_RESOURCE:
+	//	"theme:/" ("a".."z" | "A".."Z" | "$" | "_" | "." | "/" | "0".."9")*;
+	public TerminalRule getTHEME_RESOURCERule() {
+		return tTHEME_RESOURCE;
+	} 
+
+	//LInt returns ecore::EInt:
+	//	("+" | "-")? INT;
+	public LIntElements getLIntAccess() {
+		return pLInt;
+	}
+	
+	public ParserRule getLIntRule() {
+		return getLIntAccess().getRule();
+	}
+
+	//LDouble returns ecore::EDouble:
+	//	LInt ("." INT)?;
+	public LDoubleElements getLDoubleAccess() {
+		return pLDouble;
+	}
+	
+	public ParserRule getLDoubleRule() {
+		return getLDoubleAccess().getRule();
+	}
+
+	//terminal EVENT_TOPIC:
+	//	"\'" ID ("/" ID)* "/ *"? "\'";
+	public TerminalRule getEVENT_TOPICRule() {
+		return tEVENT_TOPIC;
+	} 
+
+	//JvmTypeReference:
+	//	JvmParameterizedTypeReference => ({JvmGenericArrayTypeReference.componentType=current} ArrayBrackets)* |
+	//	XFunctionTypeRef;
+	public XtypeGrammarAccess.JvmTypeReferenceElements getJvmTypeReferenceAccess() {
+		return gaXtype.getJvmTypeReferenceAccess();
+	}
+	
+	public ParserRule getJvmTypeReferenceRule() {
+		return getJvmTypeReferenceAccess().getRule();
+	}
+
+	//ArrayBrackets:
+	//	"[" "]";
+	public XtypeGrammarAccess.ArrayBracketsElements getArrayBracketsAccess() {
+		return gaXtype.getArrayBracketsAccess();
+	}
+	
+	public ParserRule getArrayBracketsRule() {
+		return getArrayBracketsAccess().getRule();
+	}
+
+	//XFunctionTypeRef:
+	//	("(" (paramTypes+=JvmTypeReference ("," paramTypes+=JvmTypeReference)*)? ")")? "=>" returnType=JvmTypeReference;
+	public XtypeGrammarAccess.XFunctionTypeRefElements getXFunctionTypeRefAccess() {
+		return gaXtype.getXFunctionTypeRefAccess();
+	}
+	
+	public ParserRule getXFunctionTypeRefRule() {
+		return getXFunctionTypeRefAccess().getRule();
+	}
+
+	//JvmParameterizedTypeReference:
+	//	type=[JvmType|QualifiedName] ("<" arguments+=JvmArgumentTypeReference ("," arguments+=JvmArgumentTypeReference)* ">"
+	//	(=> ({JvmInnerTypeReference.outer=current} ".") type=[JvmType|ValidID] ("<" arguments+=JvmArgumentTypeReference (","
+	//	arguments+=JvmArgumentTypeReference)* ">")?)*)?;
+	public XtypeGrammarAccess.JvmParameterizedTypeReferenceElements getJvmParameterizedTypeReferenceAccess() {
+		return gaXtype.getJvmParameterizedTypeReferenceAccess();
+	}
+	
+	public ParserRule getJvmParameterizedTypeReferenceRule() {
+		return getJvmParameterizedTypeReferenceAccess().getRule();
+	}
+
+	//JvmArgumentTypeReference returns JvmTypeReference:
+	//	JvmTypeReference | JvmWildcardTypeReference;
+	public XtypeGrammarAccess.JvmArgumentTypeReferenceElements getJvmArgumentTypeReferenceAccess() {
+		return gaXtype.getJvmArgumentTypeReferenceAccess();
+	}
+	
+	public ParserRule getJvmArgumentTypeReferenceRule() {
+		return getJvmArgumentTypeReferenceAccess().getRule();
+	}
+
+	//JvmWildcardTypeReference:
+	//	{JvmWildcardTypeReference} "?" (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded* |
+	//	constraints+=JvmLowerBound constraints+=JvmLowerBoundAnded*)?;
+	public XtypeGrammarAccess.JvmWildcardTypeReferenceElements getJvmWildcardTypeReferenceAccess() {
+		return gaXtype.getJvmWildcardTypeReferenceAccess();
+	}
+	
+	public ParserRule getJvmWildcardTypeReferenceRule() {
+		return getJvmWildcardTypeReferenceAccess().getRule();
+	}
+
+	//JvmUpperBound:
+	//	"extends" typeReference=JvmTypeReference;
+	public XtypeGrammarAccess.JvmUpperBoundElements getJvmUpperBoundAccess() {
+		return gaXtype.getJvmUpperBoundAccess();
+	}
+	
+	public ParserRule getJvmUpperBoundRule() {
+		return getJvmUpperBoundAccess().getRule();
+	}
+
+	//JvmUpperBoundAnded returns JvmUpperBound:
+	//	"&" typeReference=JvmTypeReference;
+	public XtypeGrammarAccess.JvmUpperBoundAndedElements getJvmUpperBoundAndedAccess() {
+		return gaXtype.getJvmUpperBoundAndedAccess();
+	}
+	
+	public ParserRule getJvmUpperBoundAndedRule() {
+		return getJvmUpperBoundAndedAccess().getRule();
+	}
+
+	//JvmLowerBound:
+	//	"super" typeReference=JvmTypeReference;
+	public XtypeGrammarAccess.JvmLowerBoundElements getJvmLowerBoundAccess() {
+		return gaXtype.getJvmLowerBoundAccess();
+	}
+	
+	public ParserRule getJvmLowerBoundRule() {
+		return getJvmLowerBoundAccess().getRule();
+	}
+
+	//JvmLowerBoundAnded returns JvmLowerBound:
+	//	"&" typeReference=JvmTypeReference;
+	public XtypeGrammarAccess.JvmLowerBoundAndedElements getJvmLowerBoundAndedAccess() {
+		return gaXtype.getJvmLowerBoundAndedAccess();
+	}
+	
+	public ParserRule getJvmLowerBoundAndedRule() {
+		return getJvmLowerBoundAndedAccess().getRule();
+	}
+
+	//JvmTypeParameter:
+	//	name=ValidID (constraints+=JvmUpperBound constraints+=JvmUpperBoundAnded*)?;
+	public XtypeGrammarAccess.JvmTypeParameterElements getJvmTypeParameterAccess() {
+		return gaXtype.getJvmTypeParameterAccess();
+	}
+	
+	public ParserRule getJvmTypeParameterRule() {
+		return getJvmTypeParameterAccess().getRule();
+	}
+
+	//QualifiedNameWithWildcard:
+	//	QualifiedName "." "*";
+	public XtypeGrammarAccess.QualifiedNameWithWildcardElements getQualifiedNameWithWildcardAccess() {
+		return gaXtype.getQualifiedNameWithWildcardAccess();
+	}
+	
+	public ParserRule getQualifiedNameWithWildcardRule() {
+		return getQualifiedNameWithWildcardAccess().getRule();
+	}
+
+	//XImportSection:
+	//	importDeclarations+=XImportDeclaration+;
+	public XtypeGrammarAccess.XImportSectionElements getXImportSectionAccess() {
+		return gaXtype.getXImportSectionAccess();
+	}
+	
+	public ParserRule getXImportSectionRule() {
+		return getXImportSectionAccess().getRule();
+	}
+
+	//XImportDeclaration:
+	//	"import" (static?="static" extension?="extension"? importedType=[JvmDeclaredType|QualifiedNameInStaticImport]
+	//	(wildcard?="*" | memberName=ValidID) | importedType=[JvmDeclaredType|QualifiedName] |
+	//	importedNamespace=QualifiedNameWithWildcard) ";"?;
+	public XtypeGrammarAccess.XImportDeclarationElements getXImportDeclarationAccess() {
+		return gaXtype.getXImportDeclarationAccess();
+	}
+	
+	public ParserRule getXImportDeclarationRule() {
+		return getXImportDeclarationAccess().getRule();
+	}
+
+	//QualifiedNameInStaticImport:
+	//	(ValidID ".")+;
+	public XtypeGrammarAccess.QualifiedNameInStaticImportElements getQualifiedNameInStaticImportAccess() {
+		return gaXtype.getQualifiedNameInStaticImportAccess();
+	}
+	
+	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")?;
+	public TerminalRule getSL_COMMENTRule() {
+		return gaXtype.getSL_COMMENTRule();
+	} 
+
+	//terminal WS:
+	//	(" " | "\t" | "\r" | "\n")+;
+	public TerminalRule getWSRule() {
+		return gaXtype.getWSRule();
+	} 
+
+	//terminal ANY_OTHER:
+	//	.;
+	public TerminalRule getANY_OTHERRule() {
+		return gaXtype.getANY_OTHERRule();
+	} 
+}
diff --git a/org.eclipse.osbp.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
new file mode 100644
index 0000000..bfc7597
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src-gen/org/eclipse/osbp/xtext/gridsource/validation/AbstractGridSourceValidator.java
@@ -0,0 +1,31 @@
+/**
+ *                                                                            
+ *  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.validation;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.emf.ecore.EPackage;
+
+public class AbstractGridSourceValidator extends org.eclipse.xtext.xbase.validation.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"));
+		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
new file mode 100644
index 0000000..77fcf22
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GenerateGridSource.mwe2
@@ -0,0 +1,168 @@
+/**
+ *                                                                            
+ *  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
+ * 
+ */
+module org.eclipse.osbp.xtext.GenerateGridSource
+
+import org.eclipse.emf.mwe.utils.*
+import org.eclipse.xtext.generator.*
+import org.eclipse.xtext.ui.generator.*
+
+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"
+
+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"
+		}
+		
+		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"
+		}
+	}
+	
+    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
new file mode 100644
index 0000000..051e78c
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GridSource.xtext
@@ -0,0 +1,125 @@
+grammar org.eclipse.osbp.xtext.gridsource.GridSource with org.eclipse.xtext.xbase.Xtype
+
+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 '{'
+	'inputs' '{'
+	inputs+=Input*
+	'}'
+	properties+=Property*
+	'}';
+
+Input returns CxGridSourceInput:
+	'inputType' inputType=JvmTypeReference
+	'filters' filters+=EQFilter ('&&' filters+=EQFilter)*;
+
+EQFilter returns CxGridSourceEQFilter:
+	{CxGridSourceEQFilter}
+	'root:' rootTypePropertyPath=NestedField '=' 'input:' inputTypePropertyPath=NestedField;
+
+Property returns CxGridProperty:
+	'prop' path=NestedField 'style' style=PropertyStyle;
+
+NestedField returns CxGridNestedField:
+	{CxGridNestedField}
+	field=[JvmOperation] path=(NestedPath)?;
+
+NestedPath returns CxGridNestedPath:
+	{CxGridNestedPath}
+	'.' field=[JvmOperation] path=(NestedPath)?;
+
+PropertyStyle returns style::CxGridPropStyle:
+	PropertyButtonStyle | PropertyHtmlStyle | PropertyProgressbarStyle | PropertyTextStyle |
+	PropertyBooleanStyle | PropertyDateStyle | PropertyNumberStyle | PropertyImageStyle | PropertyQuantityStyle |
+	PropertyPriceStyle | GridPropIndicatorStyle;
+
+PropertyButtonStyle returns style::CxGridPropButtonStyle:
+	{style::CxGridPropButtonStyle}
+	'buttonStyle' 'eventTopic' eventTopic=STRING;
+
+PropertyHtmlStyle returns style::CxGridPropHtmlStyle:
+	{style::CxGridPropHtmlStyle}
+	'htmlStyle';
+
+PropertyBooleanStyle returns style::CxGridPropBooleanStyle:
+	{style::CxGridPropBooleanStyle}
+	'boolStyle';
+
+PropertyDateStyle returns style::CxGridPropDateStyle:
+	{style::CxGridPropDateStyle}
+	'dateStyle' 'format' dateFormat=STRING;
+
+PropertyNumberStyle returns style::CxGridPropNumberStyle:
+	{style::CxGridPropNumberStyle}
+	'numberStyle' 'format' numberFormat=STRING;
+
+PropertyProgressbarStyle returns style::CxGridPropProgressbarStyle:
+	{style::CxGridPropProgressbarStyle}
+	'progressbarStyle' 'max' maxValue=LDouble;
+
+GridPropIndicatorStyle returns style::CxGridPropIndicatorStyle:
+	{style::CxGridPropIndicatorStyle}
+	'indicatorStyle' 'greenFrom' greenStarts=LDouble 'redUntil' redEnds=LDouble;
+
+PropertyQuantityStyle returns style::CxGridPropQuantityStyle:
+	{style::CxGridPropQuantityStyle}
+	'quantityStyle' (htmlPattern=STRING)? 'value' '=' valuePropertyPath=NestedField ('(' 'format' valueNumberFormat=STRING
+	')')? 'uom' '='
+	uomPropertyPath=NestedField;
+
+PropertyPriceStyle returns style::CxGridPropPriceStyle:
+	{style::CxGridPropPriceStyle}
+	'priceStyle' (htmlPattern=STRING)? 'value' '=' valuePropertyPath=NestedField ('(' 'format' valueNumberFormat=STRING
+	')')? 'currency' '='
+	currencyPropertyPath=NestedField;
+
+PropertyTextStyle returns style::CxGridPropTextStyle:
+	{style::CxGridPropTextStyle}
+	'textStyle';
+
+PropertyImageStyle returns style::CxGridPropImageStyle:
+	{style::CxGridPropImageStyle}
+	'imageStyle' ('eventTopic' eventTopic=STRING)? '{'
+	configs+=StyleConfig*
+	'}';
+
+QualifiedName:
+	ValidID (=> '.' ValidID)*;
+
+ValidID:
+	ID;
+
+StyleConfig returns style::CxGridStyleConfig:
+	NumericToResourceStyleConfig | StringToResourceStyleConfig;
+
+NumericToResourceStyleConfig returns style::CxGridStyleConfigNumericToResource:
+	'number' compare=StyleCompare value=LDouble 'then' resourceThemePath=THEME_RESOURCE;
+
+StringToResourceStyleConfig returns style::CxGridStyleConfigStringToResource:
+	'string' compare=StyleCompare value=STRING 'then' resourceThemePath=THEME_RESOURCE;
+
+enum StyleCompare returns style::CxGridCompare:
+	Equal="equal" | GreaterEqual="greater equal" | GreaterThan="greater than" | LowerEqual="lower equal" |
+	LowerThan="lower than" | NotEqual="not equal";
+
+terminal ID:
+	'^'? ('a'..'z' | 'A'..'Z' | '$' | '_') ('a'..'z' | 'A'..'Z' | '$' | '_' | '0'..'9')*;
+
+terminal INT returns ecore::EInt:
+	'0'..'9' ('0'..'9' | '_')*;
+
+terminal THEME_RESOURCE:
+	'theme:/' ('a'..'z' | 'A'..'Z' | '$' | '_' | '.' | '/' | '0'..'9')*;
+
+LInt returns ecore::EInt:
+	('+' | '-')? INT;
+
+LDouble returns ecore::EDouble:
+	LInt ('.' INT)?;
+
+terminal EVENT_TOPIC:
+	"'" (ID) ('/' ID)* ('/*')? "'";
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
new file mode 100644
index 0000000..dffd403
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GridSourceRuntimeModule.java
@@ -0,0 +1,37 @@
+/**
+ *                                                                            
+ *  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;
+
+import org.eclipse.xtext.conversion.IValueConverterService;
+import org.eclipse.xtext.generator.IOutputConfigurationProvider;
+import org.eclipse.osbp.xtext.gridsource.converter.ValueConverterService;
+import org.eclipse.osbp.xtext.gridsource.generator.OutputConfigurationProvider;
+
+/**
+ * Use this class to register components to be used at runtime / without the
+ * Equinox extension registry.
+ */
+public class GridSourceRuntimeModule extends
+		org.eclipse.osbp.xtext.gridsource.AbstractGridSourceRuntimeModule {
+
+	public Class<? extends IOutputConfigurationProvider> bindIOutputConfigurationProvider() {
+		return OutputConfigurationProvider.class;
+	}
+
+	@Override
+	public Class<? extends IValueConverterService> bindIValueConverterService() {
+		return ValueConverterService.class;
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GridSourceStandaloneSetup.java b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GridSourceStandaloneSetup.java
new file mode 100644
index 0000000..0b8dc21
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/GridSourceStandaloneSetup.java
@@ -0,0 +1,26 @@
+/**
+ *                                                                            
+ *  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;
+
+/**
+ * Initialization support for running Xtext languages 
+ * without equinox extension registry
+ */
+public class GridSourceStandaloneSetup extends GridSourceStandaloneSetupGenerated{
+
+	public static void doSetup() {
+		new GridSourceStandaloneSetup().createInjectorAndDoEMFRegistration();
+	}
+}
+
diff --git a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/converter/TOPICValueConverter.java b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/converter/TOPICValueConverter.java
new file mode 100644
index 0000000..855f956
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/converter/TOPICValueConverter.java
@@ -0,0 +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
+ * 
+ */
+ package org.eclipse.osbp.xtext.gridsource.converter;
+
+import org.eclipse.xtext.conversion.ValueConverterException;
+import org.eclipse.xtext.conversion.impl.AbstractValueConverter;
+import org.eclipse.xtext.nodemodel.INode;
+
+public class TOPICValueConverter extends AbstractValueConverter<String> {
+
+	@Override
+	public String toValue(String string, INode node)
+			throws ValueConverterException {
+		return string.replaceAll("'", "");
+	}
+
+	@Override
+	public String toString(String value) throws ValueConverterException {
+		return "'" + value + "'";
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/converter/ValueConverterService.java b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/converter/ValueConverterService.java
new file mode 100644
index 0000000..a82ec1d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/converter/ValueConverterService.java
@@ -0,0 +1,31 @@
+/**
+ *                                                                            
+ *  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.converter;
+
+import org.eclipse.xtext.common.services.DefaultTerminalConverters;
+import org.eclipse.xtext.conversion.IValueConverter;
+import org.eclipse.xtext.conversion.ValueConverter;
+import com.google.inject.Inject;
+
+public class ValueConverterService extends DefaultTerminalConverters {
+
+	@Inject
+	private TOPICValueConverter topicValueConverter;
+	
+	@ValueConverter(rule = "EVENT_TOPIC")
+	public IValueConverter<String> EVENT_TOPIC() {
+		return topicValueConverter;
+	}
+	
+}
diff --git a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/formatting/GridSourceFormatter.xtend b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/formatting/GridSourceFormatter.xtend
new file mode 100644
index 0000000..606149e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/formatting/GridSourceFormatter.xtend
@@ -0,0 +1,87 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ * 
+ *  This copyright notice shows up in the generated Java code
+ *
+ */
+ 
+package org.eclipse.osbp.xtext.gridsource.formatting
+
+import com.google.inject.Inject
+import org.eclipse.xtext.Keyword
+import org.eclipse.xtext.formatting.impl.AbstractDeclarativeFormatter
+import org.eclipse.xtext.formatting.impl.FormattingConfig
+import org.eclipse.osbp.xtext.gridsource.services.GridSourceGrammarAccess
+
+/**
+ * This class contains custom formatting description.
+ * 
+ * see : http://www.eclipse.org/Xtext/documentation.html#formatting
+ * on how and when to use it 
+ * 
+ * Also see {@link org.eclipse.xtext.xtext.XtextFormattingTokenSerializer} as an example
+ */
+class GridSourceFormatter extends AbstractDeclarativeFormatter {
+
+	@Inject extension GridSourceGrammarAccess
+
+	override void configureFormatting(FormattingConfig c) {
+		val GridSourceGrammarAccess f = getGrammarAccess() as GridSourceGrammarAccess
+
+		c.autoLinewrap = 120
+
+		c.setLinewrap(1, 1, 2).around(propertyAccess.rule)
+
+		// propertyConfigAccess
+		c.setLinewrap(0, 1, 2).before(numericToResourceStyleConfigAccess.numberKeyword_0)
+		c.setLinewrap(0, 1, 2).before(stringToResourceStyleConfigAccess.stringKeyword_0)
+
+		// nested properties
+		c.setNoSpace.after(nestedPathAccess.fullStopKeyword_1)
+		c.setNoSpace.before(nestedPathAccess.fullStopKeyword_1)
+
+		// common settings
+		c.setLinewrap(0, 0, 2).before(f.getSL_COMMENTRule());
+		c.setLinewrap(0, 0, 2).after(f.getSL_COMMENTRule());
+		c.setLinewrap(0, 0, 2).before(f.getML_COMMENTRule());
+		c.setLinewrap(0, 0, 2).after(f.getML_COMMENTRule());
+
+		for (Keyword kw : f.findKeywords("@")) {
+			c.setNoSpace().after(kw);
+		}
+		for (Keyword kw : f.findKeywords("{")) {
+			c.setIndentationIncrement.after(kw)
+			c.setLinewrap(0, 1, 1).after(kw)
+		}
+		for (Keyword kw : f.findKeywords("}")) {
+			c.setLinewrap(1, 1, 1).before(kw)
+			c.setIndentationDecrement.before(kw)
+			c.setLinewrap(1, 1, 1).after(kw)
+		}
+		for (Keyword kw : f.findKeywords("(")) {
+			c.setNoSpace().after(kw);
+		}
+		for (Keyword kw : f.findKeywords("(")) {
+			c.setNoSpace().before(kw);
+		}
+		for (Keyword kw : f.findKeywords(")")) {
+			c.setNoSpace().before(kw);
+		}
+		for (Keyword kw : f.findKeywords(";")) {
+			c.setNoSpace().before(kw);
+		}
+		for (Keyword kw : f.findKeywords(",")) {
+			c.setNoSpace().before(kw);
+		}
+	}
+}
diff --git a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/generator/GridSourceGenerator.xtend b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/generator/GridSourceGenerator.xtend
new file mode 100644
index 0000000..510c3d1
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/generator/GridSourceGenerator.xtend
@@ -0,0 +1,91 @@
+/**
+ *                                                                            
+ *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
+ *                                                                            
+ *  All rights reserved. This program and the accompanying materials           
+ *  are made available under the terms of the Eclipse Public License v1.0       
+ *  which accompanies this distribution, and is available at                  
+ *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *                                                                            
+ *  Contributors:                                                      
+ * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
+ * 
+ * 
+ *  This copyright notice shows up in the generated Java code
+ *
+ */
+ 
+package org.eclipse.osbp.xtext.gridsource.generator
+
+import com.google.inject.Inject
+import java.io.StringWriter
+import java.io.Writer
+import org.eclipse.emf.ecore.resource.Resource
+import org.eclipse.emf.ecore.util.EcoreUtil
+import org.eclipse.emf.ecore.xmi.XMLResource
+import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl
+import org.eclipse.xtext.generator.IFileSystemAccess
+import org.eclipse.xtext.generator.IGenerator
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridSource
+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.CxGridPropStyle
+
+import static extension org.eclipse.osbp.infogrid.model.gridsource.util.Util.*
+
+/**
+ * Generates code from your model files on save.
+ * 
+ * see http://www.eclipse.org/Xtext/documentation.html#TutorialCodeGeneration
+ */
+class GridSourceGenerator implements IGenerator {
+
+	override void doGenerate(Resource resource, IFileSystemAccess fsa) {
+		resource.toBinary(fsa)
+	}
+
+	def toBinary(Resource input, IFileSystemAccess fsa) {
+		val XMLResource outputRes = new XMLResourceImpl
+		val CxGridSource lModel = input.contents.get(0) as CxGridSource
+
+		// set required inputs
+		lModel.rootTypeFQN = lModel.rootType.qualifiedName
+		for (inputDef : lModel.inputs) {
+			inputDef.inputTypeFQN = inputDef.inputType.qualifiedName
+			for (filter : inputDef.filters) {
+				filter.inputTypePropertyPath.dotPath = filter.inputTypePropertyPath.calcDotPath
+				filter.rootTypePropertyPath.dotPath = filter.rootTypePropertyPath.calcDotPath
+			}
+		}
+
+		// set required properties
+		for (prop : lModel.properties) {
+			prop.dotPath = prop.calcDotPath
+			
+			// prepare dot path in styles
+			prop.style.prepare
+		}
+
+		val copy = EcoreUtil.copy(lModel)
+		outputRes.contents += copy
+
+		val Writer writer = new StringWriter
+		outputRes.save(writer, null)
+
+		fsa.generateFile(input.URI.lastSegment + ".gridsource_xmi", "xmi", writer.toString)
+	}
+
+	def dispatch void prepare(CxGridPropStyle style) {
+	}
+
+	def dispatch void prepare(CxGridPropPriceStyle style) {
+		style.valuePropertyDotPath = style.valuePropertyPath.calcDotPath
+		style.currencyPropertyDotPath = style.currencyPropertyPath.calcDotPath
+	}
+
+	def dispatch void prepare(CxGridPropQuantityStyle style) {
+		style.valuePropertyDotPath = style.valuePropertyPath.calcDotPath
+		style.uomPropertyDotPath = style.uomPropertyPath.calcDotPath
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/generator/OutputConfigurationProvider.java b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/generator/OutputConfigurationProvider.java
new file mode 100644
index 0000000..eb2e289
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/generator/OutputConfigurationProvider.java
@@ -0,0 +1,36 @@
+/**
+ * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *         Florian Pirchner - Initial implementation
+ */
+
+package org.eclipse.osbp.xtext.gridsource.generator;
+
+import java.util.Set;
+
+import org.eclipse.xtext.generator.OutputConfiguration;
+
+public class OutputConfigurationProvider extends
+		org.eclipse.xtext.generator.OutputConfigurationProvider {
+
+	public Set<OutputConfiguration> getOutputConfigurations() {
+		Set<OutputConfiguration> configs = super.getOutputConfigurations();
+
+		OutputConfiguration binOutput = new OutputConfiguration("xmi");
+		binOutput.setDescription("xmi");
+		binOutput.setOutputDirectory("./modelsbin");
+		binOutput.setOverrideExistingResources(true);
+		binOutput.setCreateOutputDirectory(true);
+		binOutput.setCleanUpDerivedResources(true);
+		binOutput.setSetDerivedProperty(true);
+		binOutput.setKeepLocalHistory(true);
+		configs.add(binOutput);
+
+		return configs;
+	}
+}
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
new file mode 100644
index 0000000..aaef6c9
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/scoping/GridSourceScopeProvider.xtend
@@ -0,0 +1,130 @@
+/**
+ *                                                                            
+ *  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
+ * 
+ * 
+ *  This copyright notice shows up in the generated Java code
+ *
+ */
+ 
+package org.eclipse.osbp.xtext.gridsource.scoping
+
+import java.util.List
+import java.util.Map
+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
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridSource
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridSourceEQFilter
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridSourceInput
+import org.eclipse.osbp.infogrid.model.gridsource.CxGridSourcePackage
+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 static extension org.eclipse.osbp.infogrid.model.gridsource.util.Util.*
+
+class GridSourceScopeProvider extends XtypeScopeProvider {
+
+	override IScope getScope(EObject context, EReference reference) {
+
+		if (context instanceof CxGridNestedField) {
+		}
+
+		return super.getScope(context, reference);
+	}
+
+	def IScope scope_CxGridNestedPath_field(CxGridNestedPath exp, EReference ref) {
+		var JvmType type = null;
+		if (exp.eContainer instanceof CxGridNestedField) {
+			val CxGridNestedField prop = exp.eContainer as CxGridNestedField
+			type = prop.field?.returnType.type
+		} else {
+			val CxGridNestedPath parent = exp.eContainer as CxGridNestedPath
+			type = parent.field?.returnType.type
+		}
+
+		return type.toGetterScope
+	}
+
+	def IScope scope_CxGridNestedField_field(CxGridSource source, EReference ref) {
+		return source?.rootType?.type.toGetterScope
+	}
+
+	def IScope scope_CxGridNestedField_field(CxGridPropQuantityStyle source, EReference ref) {
+		val CxGridProperty prop = source.eContainer as CxGridProperty
+		return prop.calcLeafType.toGetterScope
+	}
+
+	def IScope scope_CxGridNestedField_field(CxGridPropPriceStyle source, EReference ref) {
+		val CxGridProperty prop = source.eContainer as CxGridProperty
+		return prop.calcLeafType.toGetterScope
+	}
+
+	def IScope scope_CxGridNestedField_field(CxGridNestedField context, EReference reference) {
+		val container = context.eContainer
+		if (container instanceof CxGridSourceEQFilter) {
+			val input = container.eContainer as CxGridSourceInput
+			val ref = context.eContainingFeature
+			val model = EcoreUtil.getRootContainer(context) as CxGridSource
+			switch (ref) {
+				case CxGridSourcePackage.Literals.CX_GRID_SOURCE_EQ_FILTER__INPUT_TYPE_PROPERTY_PATH: {
+					return toGetterScope(input.inputType.type)
+				}
+				case CxGridSourcePackage.Literals.CX_GRID_SOURCE_EQ_FILTER__ROOT_TYPE_PROPERTY_PATH: {
+					return toGetterScope(model.rootType.type)
+				}
+			}
+		}
+		return null
+	}
+
+	def IScope scope_CxGridSourceEQFilter_rootTypePropertyPath(CxGridSourceEQFilter source, EReference ref) {
+		return null
+	}
+
+	def IScope scope_CxGridPropSparklineStyle_field(CxGridPropSparklineStyle style, EReference ref) {
+		val CxGridProperty prop = style.eContainer as CxGridProperty
+		val CxGridSource source = prop.eContainer as CxGridSource
+		return source?.rootType?.type.toGetterScope
+	}
+
+	def IScope toGetterScope(JvmType type) {
+		if (type instanceof JvmDeclaredType) {
+			val Map<String, OperationExtensions.OperationInfo> info = OperationExtensions.getOperationInfos(type);
+			val IScope scope = new AbstractScope(IScope.NULLSCOPE, true) {
+				override protected getAllLocalElements() {
+					val List<IEObjectDescription> descriptions = newArrayList()
+					for (field : info.values.filter [
+						!isStaticField && field != null && !name.equals("class")
+					]) {
+						val Map<String, String> userData = newHashMap()
+						userData.put("readonly", field.readonly.toString)
+						descriptions.add(EObjectDescription.create(field.name, field.getter, userData))
+					}
+					return descriptions
+				}
+			}
+			return scope
+		}
+		return IScope::NULLSCOPE
+	}
+}
diff --git a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/scoping/OperationExtensions.java b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/scoping/OperationExtensions.java
new file mode 100644
index 0000000..b326a93
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/scoping/OperationExtensions.java
@@ -0,0 +1,220 @@
+/**
+ * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *         Florian Pirchner - Initial implementation
+ */
+
+package org.eclipse.osbp.xtext.gridsource.scoping;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.xtext.common.types.JvmDeclaredType;
+import org.eclipse.xtext.common.types.JvmFeature;
+import org.eclipse.xtext.common.types.JvmField;
+import org.eclipse.xtext.common.types.JvmOperation;
+import org.eclipse.xtext.common.types.JvmVisibility;
+import org.eclipse.osbp.infogrid.model.gridsource.util.Util;
+
+public class OperationExtensions {
+
+	/**
+	 * Calculates the operation infos for the given type.
+	 * 
+	 * @param type
+	 * @return
+	 */
+	public static Map<String, OperationInfo> getOperationInfos(
+			JvmDeclaredType type) {
+		return getOperationInfos(type, null);
+	}
+
+	/**
+	 * Calculates the operation infos for the given type.
+	 * 
+	 * @param type
+	 * @param filterName
+	 *            - is used to filter only methods property names matching the
+	 *            filter name.
+	 * @return
+	 */
+	public static Map<String, OperationInfo> getOperationInfos(
+			JvmDeclaredType type, String filterName) {
+		Map<String, OperationInfo> infos = new HashMap<String, OperationInfo>();
+		for (JvmFeature feature : type.getAllFeatures()) {
+			if (!(feature instanceof JvmOperation)) {
+				continue;
+			}
+
+			JvmOperation operation = (JvmOperation) feature;
+			if (operation.getVisibility() != JvmVisibility.PUBLIC) {
+				continue;
+			}
+
+			if (!Util.isSetter(operation.getSimpleName())
+					&& operation.getParameters().size() > 1) {
+				continue;
+			}
+
+			String propertyName = Util
+					.toPropertyName(operation.getSimpleName());
+			if (propertyName == null) {
+				continue;
+			}
+
+			if (filterName != null && !filterName.equals(propertyName)) {
+				continue;
+			}
+
+			if (!Util.isGetter(operation.getSimpleName())
+					&& !Util.isSetter(operation.getSimpleName())) {
+				continue;
+			}
+
+			String id = calcId(operation.getDeclaringType(),
+					operation.getSimpleName());
+			if (!infos.containsKey(id)) {
+				OperationInfo info = new OperationInfo();
+				info.id = id;
+				info.name = propertyName;
+				info.staticField = operation.isStatic();
+				infos.put(id, info);
+			}
+
+			OperationInfo info = infos.get(id);
+			if (Util.isGetter(operation.getSimpleName())) {
+				info.getter = operation;
+			} else {
+				if (!propertyName.equals("dirty")) {
+					info.setter = operation;
+				}
+			}
+		}
+
+		// apply readonly and create descriptions
+		for (OperationInfo info : infos.values()) {
+			if (info.getter == null) {
+				continue;
+			}
+			if (info.setter == null) {
+				info.readonly = true;
+			}
+		}
+
+		for (JvmFeature field : type.getAllFeatures()) {
+			if (!(field instanceof JvmField)) {
+				continue;
+			}
+
+			String id = calcFieldId(field.getDeclaringType(),
+					field.getSimpleName());
+			if (infos.containsKey(id)) {
+				OperationInfo info = infos.get(id);
+				info.setField((JvmField) field);
+			}
+		}
+		return infos;
+	}
+
+	/**
+	 * Normalizes the name.
+	 * 
+	 * @param declaringType
+	 * @param simpleName
+	 * @return
+	 */
+	public static String calcId(JvmDeclaredType declaringType, String simpleName) {
+		String tempName = Util.toPropertyName(simpleName);
+		if (tempName == null) {
+			return null;
+		}
+
+		return declaringType.getQualifiedName() + ":" + tempName;
+	}
+
+	/**
+	 * Normalizes the name.
+	 * 
+	 * @param declaringType
+	 * @param simpleName
+	 * @return
+	 */
+	public static String calcFieldId(JvmDeclaredType declaringType,
+			String simpleName) {
+		return declaringType.getQualifiedName() + ":" + simpleName;
+	}
+
+	public static class OperationInfo {
+
+		private String id;
+		private String name;
+		private boolean readonly;
+		private boolean staticField;
+		private JvmOperation getter;
+		private JvmOperation setter;
+		private JvmField field;
+
+		public String getId() {
+			return id;
+		}
+
+		public void setId(String id) {
+			this.id = id;
+		}
+
+		public String getName() {
+			return name;
+		}
+
+		public void setName(String name) {
+			this.name = name;
+		}
+
+		public boolean isReadonly() {
+			return readonly;
+		}
+
+		public void setReadonly(boolean readonly) {
+			this.readonly = readonly;
+		}
+
+		public JvmOperation getGetter() {
+			return getter;
+		}
+
+		public void setGetter(JvmOperation getter) {
+			this.getter = getter;
+		}
+
+		public JvmOperation getSetter() {
+			return setter;
+		}
+
+		public void setSetter(JvmOperation setter) {
+			this.setter = setter;
+		}
+
+		public JvmField getField() {
+			return field;
+		}
+
+		public void setField(JvmField field) {
+			this.field = field;
+		}
+
+		public boolean isStaticField() {
+			return staticField;
+		}
+
+		public void setStaticField(boolean staticField) {
+			this.staticField = staticField;
+		}
+
+	}
+
+}
diff --git a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/scoping/SuperTypeCollector.java b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/scoping/SuperTypeCollector.java
new file mode 100644
index 0000000..fc7183d
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/scoping/SuperTypeCollector.java
@@ -0,0 +1,324 @@
+/*******************************************************************************
+ * Copyright (c) 2009 itemis AG (http://www.itemis.eu) and others.
+ * 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
+ *******************************************************************************/
+package org.eclipse.osbp.xtext.gridsource.scoping;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.common.types.JvmAnyTypeReference;
+import org.eclipse.xtext.common.types.JvmArrayType;
+import org.eclipse.xtext.common.types.JvmConstraintOwner;
+import org.eclipse.xtext.common.types.JvmDeclaredType;
+import org.eclipse.xtext.common.types.JvmDelegateTypeReference;
+import org.eclipse.xtext.common.types.JvmGenericArrayTypeReference;
+import org.eclipse.xtext.common.types.JvmLowerBound;
+import org.eclipse.xtext.common.types.JvmMultiTypeReference;
+import org.eclipse.xtext.common.types.JvmParameterizedTypeReference;
+import org.eclipse.xtext.common.types.JvmPrimitiveType;
+import org.eclipse.xtext.common.types.JvmSpecializedTypeReference;
+import org.eclipse.xtext.common.types.JvmType;
+import org.eclipse.xtext.common.types.JvmTypeConstraint;
+import org.eclipse.xtext.common.types.JvmTypeReference;
+import org.eclipse.xtext.common.types.TypesFactory;
+import org.eclipse.xtext.common.types.util.TypeReferences;
+import org.eclipse.xtext.common.types.util.TypesSwitch;
+
+import com.google.common.collect.Sets;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+/**
+ * @author Sebastian Zarnekow - Initial contribution and API
+ * @author Sven Efftinge
+ */
+@Deprecated
+@Singleton
+@SuppressWarnings("restriction")
+public class SuperTypeCollector {
+
+	public interface SuperTypeAcceptor {
+		/**
+		 * @param superType a found super type
+		 * @param distance the distance to the starting type. StringBuilder has a distance 1 to 
+		 * AbstractStringBuilder, distance 1 and 2 to CharSequence and distance 2 to Appendable.
+		 */
+		boolean accept(JvmTypeReference superType, int distance);
+	}
+	
+	@Inject(optional=true)
+	private TypesFactory factory = TypesFactory.eINSTANCE;
+	
+	@Inject
+	private TypeReferences typeReferences;
+	
+	protected JvmTypeReference newRef(JvmType type) {
+		if (type instanceof JvmArrayType) {
+			JvmTypeReference componentType = newRef(((JvmArrayType) type).getComponentType());
+			JvmGenericArrayTypeReference reference = factory.createJvmGenericArrayTypeReference();
+			reference.setComponentType(componentType);
+			return reference;
+		} else {
+			JvmParameterizedTypeReference reference = factory.createJvmParameterizedTypeReference();
+			reference.setType(type);
+			return reference;
+		}
+	}
+
+	public Set<JvmTypeReference> collectSuperTypes(JvmType type) {
+		return collectSuperTypes(newRef(type));
+	}
+
+	public Set<JvmTypeReference> collectSuperTypes(JvmTypeReference type) {
+		final Set<JvmTypeReference> result = Sets.newLinkedHashSet();
+		final Set<JvmType> rawTypes = Sets.newHashSet();
+		doCollectSupertypeData(type, new SuperTypeAcceptor() {
+			public boolean accept(JvmTypeReference superType, int distance) {
+				JvmType rawType = superType.getType();
+				if (rawType != null && !rawType.eIsProxy() && rawTypes.add(superType.getType())) {
+					result.add(superType);
+					return true;
+				}
+				return false;
+			}
+		});
+		return result;
+	}
+	
+	public void collectSuperTypes(JvmTypeReference type, SuperTypeAcceptor acceptor) {
+		doCollectSupertypeData(type, acceptor);
+	}
+
+	public Set<String> collectSuperTypeNames(JvmType type) {
+		return collectSuperTypeNames(newRef(type));
+	}
+
+	public Set<JvmType> collectSuperTypesAsRawTypes(JvmTypeReference type) {
+		final Set<JvmType> result = Sets.newLinkedHashSet();
+		doCollectSupertypeData(type, new SuperTypeAcceptor() {
+			public boolean accept(JvmTypeReference superType, int distance) {
+				JvmType rawType = superType.getType();
+				if (rawType != null && !rawType.eIsProxy()) {
+					boolean notYetSeen = result.add(superType.getType());
+					return notYetSeen;
+				}
+				return false;
+			}
+		});
+		return result;
+	}
+
+	public Set<String> collectSuperTypeNames(JvmTypeReference type) {
+		final Set<String> result = Sets.newLinkedHashSet();
+		doCollectSupertypeData(type, new SuperTypeAcceptor() {
+			public boolean accept(JvmTypeReference superType, int distance) {
+				String name = getSuperTypeName(superType);
+				if (name != null)
+					return result.add(name);
+				return false;
+			}
+			
+			public String getSuperTypeName(JvmTypeReference typeReference) {
+				if (typeReference instanceof JvmParameterizedTypeReference) {
+					JvmType rawType = typeReference.getType();
+					if (rawType != null && !rawType.eIsProxy()) {
+						return rawType.getIdentifier();
+					}
+					return null;
+				} else {
+					return typeReference.getIdentifier();
+				}
+			}
+		});
+		return result;
+	}
+
+	public void doCollectSupertypeData(JvmTypeReference type, SuperTypeAcceptor acceptor) {
+		if (type != null) {
+			Implementation implementation = new Implementation(acceptor, typeReferences);
+			implementation.doSwitch(type);
+		}
+	}
+
+	@Deprecated
+	static class Implementation extends TypesSwitch<Boolean> {
+
+		private boolean collecting = false;
+		private SuperTypeAcceptor acceptor;
+		private int level;
+		private final TypeReferences references;
+
+		Implementation(SuperTypeAcceptor acceptor, TypeReferences references) {
+			this.acceptor = acceptor;
+			this.references = references;
+			this.level = 0;
+		}
+		
+		@Override
+		public Boolean doSwitch(EObject theEObject) {
+			if (theEObject == null)
+				return Boolean.FALSE;
+			return super.doSwitch(theEObject);
+		}
+		
+		@Override
+		public Boolean caseJvmTypeReference(JvmTypeReference object) {
+			if (!object.eIsProxy()) {
+				if (!collecting || acceptor.accept(object, level)) {
+					collecting = true;
+					if (object.getType() != null)
+						doSwitch(object.getType());
+				}
+			}
+			return Boolean.FALSE;
+		}
+		
+		@Override
+		public Boolean caseJvmGenericArrayTypeReference(JvmGenericArrayTypeReference object) {
+			if (!object.eIsProxy()) {
+				level++;
+				final SuperTypeAcceptor original = acceptor;
+				try {
+					final boolean[] outerCollecting = { collecting };
+					acceptor = new SuperTypeAcceptor() {
+						public boolean accept(JvmTypeReference superType, int distance) {
+							JvmTypeReference arraySuperType = references.createArrayType(superType);
+							boolean result = !outerCollecting[0];
+							if (!outerCollecting[0] || (result = original.accept(arraySuperType, distance))) {
+								outerCollecting[0] = true;
+							}
+							if (references.is(superType, Object.class)) {
+								outerCollecting[0] = true;
+								result = original.accept(superType, distance + 1) || result;
+								result = original.accept(references.getTypeForName(Serializable.class, superType.getType()), distance + 1) || result;
+								result = original.accept(references.getTypeForName(Cloneable.class, superType.getType()), distance + 1) || result;
+							}
+							return result;
+						}
+					};
+					if (object.getComponentType() != null) {
+						collecting = true;
+						doSwitch(object.getComponentType());
+					}
+				} finally {
+					acceptor = original;
+				}
+				JvmArrayType rawArrayType = object.getType();
+				if (rawArrayType != null) {
+					JvmType rawType = rawArrayType.getComponentType();
+					while(rawType instanceof JvmArrayType) {
+						rawType = ((JvmArrayType) rawType).getComponentType();
+					}
+					if (rawType instanceof JvmPrimitiveType) {
+						collecting = true;
+						doSwitch(references.getTypeForName(Serializable.class, rawType));
+						doSwitch(references.getTypeForName(Cloneable.class, rawType));
+					}
+				}
+				level--;
+			}
+			return Boolean.FALSE;
+		}
+		
+		@Override
+		public Boolean caseJvmMultiTypeReference(JvmMultiTypeReference object) {
+			if (!object.eIsProxy()) {
+				collecting = true;
+				level++;
+				for(JvmTypeReference reference: object.getReferences()) {
+					doSwitch(reference);
+				}
+				level--;
+			}
+			return Boolean.FALSE;
+		}
+		
+		@Override
+		public Boolean caseJvmDelegateTypeReference(JvmDelegateTypeReference object) {
+			if (!object.eIsProxy()) {
+				collecting = true;
+				doSwitch(object.getDelegate());
+			}
+			return Boolean.FALSE;
+		}
+		
+		@Override
+		public Boolean caseJvmSpecializedTypeReference(JvmSpecializedTypeReference object) {
+			if (!object.eIsProxy()) {
+				collecting = true;
+				level++;
+				JvmTypeReference equivalent = object.getEquivalent();
+				if (equivalent != null)
+					doSwitch(equivalent);
+				level--;
+			}
+			return Boolean.FALSE;
+		}
+		
+		@Override
+		public Boolean caseJvmAnyTypeReference(JvmAnyTypeReference object) {
+			return Boolean.FALSE;
+		}
+		
+		@Override
+		public Boolean caseJvmDeclaredType(JvmDeclaredType object) {
+			if (!object.eIsProxy()) {
+				level++;
+				for (JvmTypeReference superType : object.getSuperTypes()) {
+					doSwitch(superType);
+				}
+				level--;
+			}
+			return Boolean.FALSE;
+		}
+		
+		@Override
+		public Boolean caseJvmTypeConstraint(JvmTypeConstraint object) {
+			if (object.getTypeReference() != null)
+				return doSwitch(object.getTypeReference());
+			return Boolean.FALSE;
+		}
+		
+		@Override
+		public Boolean caseJvmConstraintOwner(JvmConstraintOwner object) {
+			if (!object.eIsProxy()) {
+				List<JvmTypeConstraint> constraints = object.getConstraints();
+				boolean boundProcessed = false;
+				if (!constraints.isEmpty()) {
+					for(JvmTypeConstraint constraint: constraints) {
+						if (constraint instanceof JvmLowerBound) {
+							doSwitch(constraint);
+							boundProcessed = true;
+						}
+					}
+					if (!boundProcessed) { 
+						for(JvmTypeConstraint constraint: constraints) {
+							doSwitch(constraint);
+							boundProcessed = true;
+						}
+					}
+				}
+				if (!boundProcessed) {
+					JvmType objectType = references.findDeclaredType(Object.class, object);
+					if (objectType != null)
+						doSwitch(references.createTypeRef(objectType));
+				}
+			}
+			return Boolean.FALSE;
+		}
+		
+	}
+
+	public boolean isSuperType(JvmDeclaredType subType, JvmDeclaredType superType) {
+		if (subType==null || superType == null)
+			return false;
+		return collectSuperTypesAsRawTypes(newRef(subType)).contains(superType);
+	}
+	
+}
diff --git a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/scoping/TypeHelper.java b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/scoping/TypeHelper.java
new file mode 100644
index 0000000..19a33d3
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/scoping/TypeHelper.java
@@ -0,0 +1,233 @@
+/**
+ * Copyright (c) 2011, 2015 - Lunifera GmbH (Gross Enzersdorf, Austria), Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *         Florian Pirchner - Initial implementation
+ */
+
+package org.eclipse.osbp.xtext.gridsource.scoping;
+
+import java.util.Collection;
+import java.util.Date;
+
+import org.eclipse.xtext.common.types.JvmAnnotationReference;
+import org.eclipse.xtext.common.types.JvmDeclaredType;
+import org.eclipse.xtext.common.types.JvmEnumerationType;
+import org.eclipse.xtext.common.types.JvmField;
+import org.eclipse.xtext.common.types.JvmType;
+import org.eclipse.xtext.common.types.util.TypeReferences;
+import org.eclipse.osbp.xtext.gridsource.scoping.OperationExtensions.OperationInfo;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@SuppressWarnings({ "restriction", "deprecation" })
+@Singleton
+public class TypeHelper {
+
+	@Inject
+	private TypeReferences typeReferences;
+
+	@Inject
+	private SuperTypeCollector superTypeCollector;
+
+	/**
+	 * Returns true, if the type is numeric without digits
+	 * 
+	 * @param type
+	 * @return
+	 */
+	public boolean isNumber(JvmType type) {
+		if (typeReferences.is(type, Byte.class)
+				|| typeReferences.is(type, Byte.TYPE)
+				|| typeReferences.is(type, Short.class)
+				|| typeReferences.is(type, Short.TYPE)
+				|| typeReferences.is(type, Integer.class)
+				|| typeReferences.is(type, Integer.TYPE)
+				|| typeReferences.is(type, Long.class)
+				|| typeReferences.is(type, Long.TYPE)
+				|| typeReferences.is(type, Float.class)
+				|| typeReferences.is(type, Float.TYPE)
+				|| typeReferences.is(type, Double.class)
+				|| typeReferences.is(type, Double.TYPE)) {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Returns true, if the type is numeric
+	 * 
+	 * @param type
+	 * @return
+	 */
+	public boolean isNumberWithoutDigits(JvmType type) {
+		if (typeReferences.is(type, Byte.class)
+				|| typeReferences.is(type, Byte.TYPE)
+				|| typeReferences.is(type, Short.class)
+				|| typeReferences.is(type, Short.TYPE)
+				|| typeReferences.is(type, Integer.class)
+				|| typeReferences.is(type, Integer.TYPE)
+				|| typeReferences.is(type, Long.class)
+				|| typeReferences.is(type, Long.TYPE)) {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Returns true, if the type is numeric with digits
+	 * 
+	 * @param type
+	 * @return
+	 */
+	public boolean isNumberWithDigits(JvmType type) {
+		if (typeReferences.is(type, Float.class)
+				|| typeReferences.is(type, Float.TYPE)
+				|| typeReferences.is(type, Double.class)
+				|| typeReferences.is(type, Double.TYPE)) {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Returns the qualified name of the given numeric type. Throws exception,
+	 * if the given type is not a valid number.
+	 * 
+	 * @param name
+	 * @return
+	 */
+	public String toNumericQualifiedName(JvmType type) {
+		return toNumericType(type).getName();
+	}
+
+	/**
+	 * Returns the class file of the given numeric type. Throws exception, if
+	 * the given type is not a valid number.
+	 * 
+	 * @param type
+	 * @return
+	 */
+	public Class<? extends Number> toNumericType(JvmType type) {
+		if (typeReferences.is(type, Byte.class)
+				|| typeReferences.is(type, Byte.TYPE)) {
+			return Byte.class;
+		} else if (typeReferences.is(type, Short.class)
+				|| typeReferences.is(type, Short.TYPE)) {
+			return Short.class;
+		} else if (typeReferences.is(type, Integer.class)
+				|| typeReferences.is(type, Integer.TYPE)) {
+			return Integer.class;
+		} else if (typeReferences.is(type, Long.class)
+				|| typeReferences.is(type, Long.TYPE)) {
+			return Long.class;
+		} else if (typeReferences.is(type, Float.class)
+				|| typeReferences.is(type, Float.TYPE)) {
+			return Float.class;
+		} else if (typeReferences.is(type, Double.class)
+				|| typeReferences.is(type, Double.TYPE)) {
+			return Double.class;
+		}
+		throw new IllegalArgumentException(type + " is not a valid number type");
+	}
+
+	/**
+	 * Returns true, if the type is boolean
+	 * 
+	 * @param type
+	 * @return
+	 */
+	public boolean isBoolean(JvmType type) {
+		if (typeReferences.is(type, Boolean.class)
+				|| typeReferences.is(type, Boolean.TYPE)) {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Returns true, if the type is boolean
+	 * 
+	 * @param type
+	 * @return
+	 */
+	public boolean isString(JvmType type) {
+		if (typeReferences.is(type, String.class)) {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Returns true, if the type is date
+	 * 
+	 * @param type
+	 * @return
+	 */
+	public boolean isDate(JvmType type) {
+		if (typeReferences.is(type, Date.class)) {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Returns true, if the type is enum
+	 * 
+	 * @param type
+	 * @return
+	 */
+	public boolean isEnum(JvmType type) {
+		return type instanceof JvmEnumerationType;
+	}
+
+	/**
+	 * Returns true, if the type is enum
+	 * 
+	 * @param type
+	 * @return
+	 */
+	public boolean isDomainReference(OperationInfo info) {
+		JvmField field = info.getField();
+		if (field == null) {
+			return false;
+		}
+
+		if (isCollection(field)) {
+			return false;
+		}
+
+//		for (JvmAnnotationReference ref : field.getAnnotations()) {
+//			if (typeReferences.is(ref.getAnnotation(), DomainReference.class)) {
+//				return true;
+//			}
+//		}
+
+		return false;
+	}
+
+	public boolean isCollection(JvmField field) {
+		JvmType fieldType = field.getType().getType();
+		if (!(fieldType instanceof JvmDeclaredType)) {
+			// in case of proxy
+			return false;
+		}
+		JvmType collectionType = typeReferences.findDeclaredType(
+				Collection.class, field);
+		if (!(collectionType instanceof JvmDeclaredType)) {
+			// in case of proxy
+			return false;
+		}
+
+		if (superTypeCollector.isSuperType((JvmDeclaredType) fieldType,
+				(JvmDeclaredType) collectionType)) {
+			return true;
+		}
+		return false;
+	}
+}
diff --git a/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/validation/GridSourceValidator.xtend b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/validation/GridSourceValidator.xtend
new file mode 100644
index 0000000..82c4225
--- /dev/null
+++ b/org.eclipse.osbp.xtext.gridsource/src/org/eclipse/osbp/xtext/gridsource/validation/GridSourceValidator.xtend
@@ -0,0 +1,116 @@
+/**
+ *                                                                            
+ *  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
+ * 
+ * 
+ *  This copyright notice shows up in the generated Java code
+ *
+ */
+ 
+package org.eclipse.osbp.xtext.gridsource.validation
+
+import java.text.DateFormat
+import java.text.DecimalFormat
+import java.text.SimpleDateFormat
+import java.util.Date
+import java.util.Set
+import org.eclipse.emf.ecore.EClass
+import org.eclipse.xtext.validation.Check
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridEventTopicAble
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropDateStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropImageStyle
+import org.eclipse.osbp.infogrid.model.gridsource.style.CxGridPropNumberStyle
+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.CxGridStylePackage
+
+class GridSourceValidator extends AbstractGridSourceValidator {
+
+	@Check
+	def void checkDateformat(CxGridPropDateStyle style) {
+		if (style.dateFormat.nullOrEmpty) {
+			return
+		}
+
+		try {
+			val DateFormat df = new SimpleDateFormat(style.dateFormat)
+			df.format(new Date())
+		} catch (Exception ex) {
+			error('''«style.dateFormat» is not a valid date format''', style,
+				CxGridStylePackage.Literals.CX_GRID_PROP_DATE_STYLE__DATE_FORMAT)
+		}
+	}
+
+	@Check
+	def void checkMixedStyleConfigs(CxGridPropImageStyle style) {
+		var index = -1
+		val Set types = <EClass>newHashSet()
+		for (config : style.configs) {
+			index++
+			types.add(config.eClass)
+
+			if (types.length > 1) {
+				error('''You MUST NOT mix up different types of configs.''', style,
+					CxGridStylePackage.Literals.CX_GRID_PROP_IMAGE_STYLE__CONFIGS, index)
+				return
+			}
+		}
+	}
+
+	@Check
+	def void checkNumberformat(CxGridPropNumberStyle style) {
+		if (style.numberFormat.nullOrEmpty) {
+			return
+		}
+
+		try {
+			val df = new DecimalFormat(style.numberFormat)
+			df.format(1000.123)
+		} catch (Exception ex) {
+			error('''«style.numberFormat» is not a valid number format''', style,
+				CxGridStylePackage.Literals.CX_GRID_PROP_NUMBER_STYLE__NUMBER_FORMAT)
+		}
+	}
+
+	@Check
+	def void checkEventTopic(CxGridEventTopicAble topic) {
+		if (topic.eventTopic.nullOrEmpty) {
+			return
+		}
+
+		if (topic.eventTopic.startsWith("/")) {
+			error('''Eventtopic «topic.eventTopic» must not start with "/"''', topic,
+				CxGridStylePackage.Literals.CX_GRID_EVENT_TOPIC_ABLE__EVENT_TOPIC)
+		}
+	}
+
+	@Check
+	def void checkHtmlPattern(CxGridPropPriceStyle style) {
+		if(style.htmlPattern.nullOrEmpty) {
+			return
+		}
+		if (style.htmlPattern.nullOrEmpty || !style.htmlPattern.contains("{@value}") || !style.htmlPattern.contains("{@currency}")) {
+			error('''HtmlPattern needs to contain the placeholders {@value} and {@currency}.''', style,
+				CxGridStylePackage.Literals.CX_GRID_PROP_PRICE_STYLE__HTML_PATTERN)
+		}
+	}
+
+	@Check
+	def void checkHtmlPattern(CxGridPropQuantityStyle style) {
+		if(style.htmlPattern.nullOrEmpty) {
+			return
+		}
+		if (style.htmlPattern.nullOrEmpty || !style.htmlPattern.contains("{@value}") || !style.htmlPattern.contains("{@uom}")) {
+			error('''HtmlPattern needs to contain the placeholders {@value} and {@uom}.''', style,
+				CxGridStylePackage.Literals.CX_GRID_PROP_QUANTITY_STYLE__HTML_PATTERN)
+		}
+	}
+}
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..e17edf6
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,120 @@
+<?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 implementation 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>
+
+    <groupId>org.eclipse.osbp.xtext.gridsource</groupId>
+    <artifactId>org.eclipse.osbp.xtext.gridsource.aggregator</artifactId>
+    <packaging>pom</packaging>
+
+    <parent>
+        <groupId>org.eclipse.osbp.releng.maven</groupId>
+        <artifactId>org.eclipse.osbp.releng.maven.parent.tycho</artifactId>
+        <version>0.9.0-SNAPSHOT</version>
+    </parent>
+
+    <url>${osbp.site.repository.url}</url>
+    <scm>
+        <url>${osbp.scm.url}</url>
+        <connection>${osbp.scm.connection}</connection>
+        <developerConnection>${osbp.scm.connection.dev}</developerConnection>
+        <tag>HEAD</tag>
+    </scm>
+    <distributionManagement>
+        <site>
+            <id>gh-pages</id>
+            <name>OSBP GitHub Pages</name>
+            <url>${distribution.site.url}</url>
+        </site>
+    </distributionManagement>
+
+    <properties>
+        <osbp.gitrepo.name>${project.groupId}</osbp.gitrepo.name>
+    </properties>
+
+    <modules>
+        <module>org.eclipse.osbp.xtext.gridsource</module>
+        <module>org.eclipse.osbp.xtext.gridsource.tests</module>
+        <module>org.eclipse.osbp.xtext.gridsource.ui</module>
+    
+        <module>org.eclipse.osbp.xtext.gridsource.feature</module>
+    </modules>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.eclipse.tycho</groupId>
+                    <artifactId>target-platform-configuration</artifactId>
+                    <version>${tycho-version}</version>
+                    <configuration>
+                        <resolver>p2</resolver>
+                        <pomDependencies>consider</pomDependencies>
+                        <environments>
+                            <environment>
+                                <os>win32</os>
+                                <ws>win32</ws>
+                                <arch>x86_64</arch>
+                            </environment>
+                            <environment>
+                                <os>linux</os>
+                                <ws>gtk</ws>
+                                <arch>x86</arch>
+                            </environment>
+                            <environment>
+                                <os>linux</os>
+                                <ws>gtk</ws>
+                                <arch>x86_64</arch>
+                            </environment>
+                            <environment>
+                                <os>macosx</os>
+                                <ws>cocoa</ws>
+                                <arch>x86_64</arch>
+                            </environment>
+                        </environments>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+        <plugins>
+            <plugin>
+                <artifactId>maven-clean-plugin</artifactId>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>xtend-gen</directory>
+                            <includes>
+                                <include>**</include>
+                            </includes>
+                        </fileset>
+                    </filesets>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.eclipse.xtend</groupId>
+                <artifactId>xtend-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>compile</goal>
+                            <goal>testCompile</goal>
+                        </goals>
+                        <configuration>
+                            <outputDirectory>xtend-gen</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+    <version>0.9.0-SNAPSHOT</version>
+</project>
